0

我有一个数组,其中的值可以由一个单词或多个创建短语的单词组成。这个数组的每个值也可以有 html 标签。我只想匹配不以 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 例如,如果表达式匹配,对应的 $NI 应该使用什么?

谢谢

4

2 回答 2

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。

于 2012-04-06T02:00:22.463 回答
1

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

变量$word有什么值?替换$word\w+和可能有效.*.*?需要问号以使句号尽可能少地抓取符号以匹配整个术语(有关更多详细信息,请查看此 Regex 参考*并与进行比较*?

编辑:根据您的评论,您的实际问题是您的正则表达式匹配从行首到您的单词的所有内容,并且您将所有这些替换为<b>(word)</b>. 您可以尝试将.*括号放入:(.*),所以现在您将得到:$1包含单词之前的所有内容,并$2包含单词本身。然后制作替换字符串'$1<b>$2</b>'

于 2012-04-06T00:11:59.510 回答