除了空格之外,正则表达式匹配硬回报

时间:2011-10-31 13:26:47

标签: php regex

当有多余的空白区域时,下面会匹配。现在我需要它来匹配,无论它之间是什么......我尝试用\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);

3 个答案:

答案 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元素,则不应使用正则表达式。