preg_replace exclude“以...开头”

时间:2012-04-06 00:00:15

标签: php regex preg-replace

我有一个数组,其值可以由一个或多个创建短语的单词组成。此数组的每个值也可以包含h​​tml标记。我想只匹配那些不以html标签开头的那些并替换数组中的单词。

我正在寻找“如何”。

"how it's made" 

成为

"<b>how</b> it's made"

,而

<span style="somethig:value">how it's made</span>

应保持不变。

我试过这个

$words_result = preg_replace('/^(?!<span).*('.$word.')/', '<b>$1</b>', $words_result);  

但我总是得到混音结果,我不知道调试它。另外,在处理正则表达式时,我总是遇到问题:D 例如,如果表达式匹配,我应该使用的对应$ N是什么?

谢谢

2 个答案:

答案 0 :(得分:1)

美元数字代表您添加的括号。 $ 1是在正则表达式中第一个括号中捕获的任何内容,$ 2是与第二个括号匹配的内容等。在许多正则表达式引擎中,$ 0将包含整个匹配。所以在这种情况下,你会发现你的第一个单词存储在$ 1。

变量$word有什么价值?将$word替换为\w+,将.*替换为.*?可能会有效。需要使用问号来使句点占用尽可能少的符号以匹配整个字词(有关详细信息,请查看this Regex reference并将**?进行比较)< / p>

修改:根据您的评论,您的实际问题是您的正则表达式匹配从行的开头到您的单词的所有内容,并将{em>所有替换为<b>(word)</b>。您可以尝试将.*放入方括号:(.*),现在您将获得:$1包含最多单词的所有内容,$2包含单词本身。然后创建替换字符串'$1<b>$2</b>'

答案 1 :(得分:1)

也许我在这里遗漏了一些东西,但似乎解决这个问题的一个简单方法就是检查尖括号的第一个字符:

$phrases = array(
    "how it's made",
    "another phrase",
    "<b>Eat the food, Tina!</b>",
    "<i>Fizz</i><u>buzz</u>"
);
foreach ($phrases as $index => $phrase) {
    if ($phrase[0] == '<')
        continue;
    $replacement = preg_replace('/^([A-Za-z0-9]+)/', '<b>$1</b>', $phrase);
    $phrases[$index] = $replacement;
}

如果可能的话,我都是为了避免过度工程。 :)

编辑:删除了伪代码并替换为真正的PHP。