当前位置: 首页 > 面试题库 >

PHP正则表达式以匹配HTML标签之外的关键字

轩辕修能
2023-03-14
问题内容

我一直在尝试做一个正则表达式来匹配和替换HTML一部分上关键字的出现:

  1. 我想匹配keyword<strong>keyword</strong>
  2. 但是<a href="someurl.html" target="_blank">keyword</a>并且<a href="someur2.html">already linked keyword </a>不应该匹配

我只对keyword第一行的匹配(和替换)感兴趣。

我想要此操作的原因是将其替换keyword<a href="dictionary.php?k=keyword">keyword</s>,但仅当keyword它尚未位于<a>标记中时才可以。

任何帮助都感激不尽!


问题答案:

我设法通过以下方式完成了我想做的事情( 不使用Regex ):

  • 解析字符串的每个字符
  • 删除所有<a>标签(将它们复制到临时数组并在字符串上保留占位符)
  • str_replace 新字符串以替换所有关键字
  • 通过原始<a>标签重新填充占位符

如果有人需要,这是我使用的代码:

$str = <<<STRA
Moses supposes his toeses are roses,
but <a href="original-moses1.html">Moses</a> supposes erroneously;
for nobody's toeses are posies of roses,
as Moses supposes his toeses to be.
Ganda <span class="cenas"><a href="original-moses2.html" target="_blank">Moses</a></span>!
STRA;

$arr1 = str_split($str);

$arr_links = array();
$phrase_holder = '';
$current_a = 0;
$goto_arr_links = false;
$close_a = false;

foreach($arr1 as $k => $v)
{
    if ($close_a == true)
    {
        if ($v == '>') {
            $close_a = false;
        } 
        continue;
    }

    if ($goto_arr_links == true)
    {
        $arr_links[$current_a] .= $v;
    }

    if ($v == '<' && $arr1[$k+1] == 'a') { /* <a */
        // keep collecting every char until </a>
        $arr_links[$current_a] .= $v;
        $goto_arr_links = true;
    } elseif ($v == '<' && $arr1[$k+1] == '/' && $arr1[$k+2] == 'a' && $arr1[$k+3] == '>' ) { /* </a> */
        $arr_links[$current_a] .= "/a>";

        $goto_arr_links = false;
        $close_a = true;
        $phrase_holder .= "{%$current_a%}"; /* put a parameter holder on the phrase */
        $current_a++;
    }    
    elseif ($goto_arr_links == false) {
        $phrase_holder .= $v;
    }
}

echo "Links Array:\n";
print_r($arr_links);
echo "\n\n\nPhrase Holder:\n";
echo $phrase_holder;
echo "\n\n\n(pre) Final Phrase (with my keyword replaced):\n";
$final_phrase = str_replace("Moses", "<a href=\"novo-mega-link.php\">Moses</a>", $phrase_holder);
echo $final_phrase;
echo "\n\n\nFinal Phrase:\n";
foreach($arr_links as $k => $v)
{
    $final_phrase = str_replace("{%$k%}", $v, $final_phrase);
}
echo $final_phrase;

输出:

链接数组:

Array
(
    [0] => <a href="original-moses1.html">Moses</a>
    [1] => <a href="original-moses2.html" target="_blank">Moses</a>
)

词组:

Moses supposes his toeses are roses,
but {%0%} supposes erroneously;
for nobody's toeses are posies of roses,
as Moses supposes his toeses to be.
Ganda <span class="cenas">{%1%}</span>!

(上)最终词组(替换为我的关键字):

<a href="novo-mega-link.php">Moses</a> supposes his toeses are roses,
but {%0%} supposes erroneously;
for nobody's toeses are posies of roses,
as <a href="novo-mega-link.php">Moses</a> supposes his toeses to be.
Ganda <span class="cenas">{%1%}</span>!

最终词组:

<a href="novo-mega-link.php">Moses</a> supposes his toeses are roses,
but <a href="original-moses1.html">Moses</a> supposes erroneously;
for nobody's toeses are posies of roses,
as <a href="novo-mega-link.php">Moses</a> supposes his toeses to be.
Ganda <span class="cenas"><a href="original-moses2.html" target="_blank">Moses</a></span>!


 类似资料:
  • 问题内容: 我在html页面上制作了preg_replace。我的模式旨在为html中的某些单词添加周围的标记。但是,有时我的正则表达式会修改html标签。例如,当我尝试替换此文本时: 这样读,我的正则表达式也锚标记的alt属性取代亚萨尔。当前我正在使用的外观如下: 如何制作正则表达式,使其与html标记内的任何内容都不匹配? 问题答案: 您可以为此使用断言,因为您只需要确保搜索到的单词出现在或之

  • 问题内容: 我一直在尝试做一个正则表达式来匹配和替换HTML一部分上关键字的出现: 我想匹配和 但是并且不应该匹配 我只对第一行的匹配(和替换)感兴趣。 我想要这样做的原因是要替换为,但前提是它尚未位于标记内。 任何帮助都感激不尽! 问题答案: 我设法通过以下方式完成了我想做的事情( 不使用Regex ): 解析字符串的每个字符 删除所有标签(将它们复制到临时数组并在字符串上保留占位符) 新字符串

  • 问题内容: 我正在研究一个小的Python脚本来清理HTML文档。它的工作方式是接受KEEP的标签列表,然后解析不在列表中的HTML代码,破坏标签我一直在使用正则表达式来做到这一点,而且我已经能够匹配开始标签和自动关闭标签但不关闭标签。 我一直在尝试匹配结束标记的模式是。在我看来这是合乎逻辑的,所以为什么不起作用?本应匹配任何不是一个锚定标记(不就是“a”是可以anything –这只是一个例子)

  • 问题内容: 我有这个HTML: 我只需要匹配任何HTML标记之外的单词。我的意思是,如果我想匹配“简单”和“文本”,则只能从“这是简单的html文本”和最后一部分“文本”中获得结果- 结果将是“简单” 1匹配,“文本” 2火柴。有人可以帮我吗?我正在使用jQuery。 是我要匹配的单词(在这种情况下为“简单”) 是 我需要用来包装所有选定的单词(在此示例中为“简单”)。但是我只想包装 任何 HTM

  • 本文向大家介绍正则表达式匹配闭合HTML标签(支持嵌套),包括了正则表达式匹配闭合HTML标签(支持嵌套)的使用技巧和注意事项,需要的朋友参考一下 任何复杂的正则表达式都是由简单的子表达式组成的,要想写出复杂的正则来,一方面需要有化繁为简的功底,另外一方面,我们需要从正则引擎的角度去思考问题。关于正则引擎的原理,推荐《Mastering Regular Expression》中文名叫《精通正则表达

  • 问题内容: 我有这个HTML输入: 我想使用正则表达式删除HTML标记,以便输出为: 谁能建议使用正则表达式执行此操作? 问题答案: 您可以使用称为Jericho Html解析器的HTML解析器。 您可以从这里下载-http://jericho.htmlparser.net/docs/index.html Jericho HTML Parser是一个Java库,允许对HTML文档的各个部分(包括服