当有多余的空白区域时,下面会匹配。现在我需要它来匹配,无论它之间是什么......我尝试用\s*
替换.+?
,但这不起作用。我正在看一个正则表达式的备忘单,无法找出最有效的方法。
preg_replace("/<sup>(\s*)$key(\s*)<\/sup>/i", "<sup>$val</sup>", $text);
应匹配:<sup>(anything here){$key}(anything here)</sup>
更新
这很难过......我刚刚意识到我正在使用的正则表达式不需要匹配空格,而是<br>
标签......类似
$text = preg_replace("/<sup>([\s\n(<br>)]*)$key([\s\n(<br>)]*)<\/sup>/is", "<sup>$val</sup>", $text);
答案 0 :(得分:1)
我不完全确定我理解,但如果您希望.*?
也匹配换行符,则需要/s
修饰符:
preg_replace("#<sup>(.*?)$key(.*?)</sup>#is", "<sup>$val</sup>", $text);
请注意,这可能比您想象的要多。如果您有多个<sup>
代码,并且只有最后一个代码包含$key
,那么正则表达式将从第一个<sup>
到最后一个</sup>
一直匹配!所以最好具体说明你想要允许的内容。
我建议您在上述正则表达式中使用(?:(?!</?sup).)*
代替.*?
。这可确保您永远不会跨标签边界匹配:
(?: # Try to match...
(?! # (as long as it's impossible to match
</?sup # <sup or </sup
) # at the current position)
. # ... any character.
)* # Do this any number of times.
所以,最后,你得到:
preg_replace("#<sup>(?:(?!</?sup).)*$key(?:(?!</?sup).)*</sup>#is", "<sup>$val</sup>", $text);
答案 1 :(得分:0)
尝试
preg_replace("/<sup\b[^>]*>(.*?)<\/sup>/i", "<sup>$val</sup>", $text);
答案 2 :(得分:0)
我猜你是在sup元素中搜索一个特定的单词,以便sup元素匹配?
$result = preg_replace('%<sup[^>]*>.*?\b$key\b.*?</sup>%s', '<sup>$val</sup>', $text);
然后这应该做。正如@Tim Pietzcker和其他人所说,这将与一个sup一起工作。如果您有嵌套的sup元素,则不应使用正则表达式。