当有多余的空白时,下面的匹配。现在我需要它匹配,不管中间有什么……我试着用.+?
代替'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);
我不完全确定我理解,但如果您希望.*?
也匹配换行符,则需要/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);
Try
preg_replace("/<sup'b[^>]*>(.*?)<'/sup>/i", "<sup>$val</sup>", $text);
我猜您正在搜索sup元素内的特定单词,以便sup元素匹配?
$result = preg_replace('%<sup[^>]*>.*?'b$key'b.*?</sup>%s', '<sup>$val</sup>', $text);
那么这样就可以了。正如@Tim Pietzcker和其他人所说,这将与一个sup工作。如果你有嵌套的sup元素,你不应该使用regex。