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

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一部分上关键字的出现: 我想匹配和 但是并且不应该匹配 我只对第一行的匹配(和替换)感兴趣。 我想要此操作的原因是将其替换为,但仅当它尚未位于标记中时才可以。 任何帮助都感激不尽! 问题答案: 我设法通过以下方式完成了我想做的事情( 不使用Regex ): 解析字符串的每个字符 删除所有标签(将它们复制到临时数组并在字符串上保留占位符)

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

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

  • 我想验证输入的代码是否是HTML代码(必须以<代码> 我试着这么做 但是我有一个问题需要在代码中做一个\n,我需要验证第一个和结束标签(=

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 问题内容: 我正在制作一个键值解析器,其中输入字符串采用的形式。键可以包含字符,并且和值可以包含任何字符,但,,和需要用反斜杠前缀。逗号用于分隔键值对,但在最后一对之后不需要。 到目前为止,我已经可以匹配大多数键和值,但是很显然它将不能处理多于一对的字符或者任何“控制”字符都不能转义。似乎匹配所有转义字符,但不匹配任何“正常”字符。 有没有办法检查逗号分隔并匹配所有转义的“控制”字符以及普通字符?