除了空白之外,匹配硬返回的正则表达式


Regex matching hard returns in addition to white space

当有多余的空白时,下面的匹配。现在我需要它匹配,不管中间有什么……我试着用.+?代替'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。