\ w不够匹配,我应该用什么呢?

时间:2011-05-25 05:07:25

标签: php regex preg-replace

(在PHP中)我有以下字符串:

$string = '<!--:fr--><p>Mamá lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut est et tortor sagittis auctor id ut urna. Etiam quañ justo, pharetra sed bibendum at, vulputate et augue.</p> <p>Curabitur cursus mi vel quam placerat malesuada. Fusce euismod mollis tincidunt. Sed cursus, sem et porta dictum, elit purus facilisis massa, eget consectetur nisi libero eget leo. Vivamus vitae mattis nulla. varius fermentum.</p><!--:-->'

我想使用

消除<!--:fr--><!--:-->
preg_replace('/<!--:[a-z]{2}-->(\w+)<!--:-->/', '${1}', $string)

但它返回相同的$ string。有什么问题?

3 个答案:

答案 0 :(得分:3)

您的字符超出[a-zA-Z0-9_]\w匹配)。您可以匹配[\s\S],这意味着任何空格或非空格字符(即所有内容)。

您还可以将.s标志一起使用。

试试这个......

preg_replace('/<!--:[a-z]{2}-->([\s\S]+?)<!--:-->/', '${1}', $string);

Ideone

答案 1 :(得分:1)

另一种可能性是您只需删除不需要的部分。

preg_replace('/<!--:(?:[a-z]{2})?-->/', '', $string);

这仅匹配您不想要的部分<!--:(?:[a-z]{2})?-->,其中(?:[a-z]{2})?是两个可选的小写字母,这意味着它将匹配这两个部分。

答案 2 :(得分:0)

要解决您的问题,您只需要一个简单的正则表达式,如<!--:(fr)?-->和PHP代码,如:

$string = preg_replace('/<!--:(fr)?-->/', '', $string);

要回答这个问题:\w是一个非常有限且不推荐的快捷方式。它将例如与您的输入中的ñ不匹配,也不匹配,。 PHP对Unicode有很好的支持。快捷方式\p{L}匹配任何语言的任何字母。还有任何标点符号的快捷方式等。这些可以组合在一个字符类中。例如。如果你想在任何序列中匹配至少一个字母(包括法语和西班牙语字母),点或逗号,你可以写:

[\p{L}.,]+

这里有一些关于它是如何工作的信息: