2011-05-25 48 views
1

(在PHP)我有以下字符串: w不够匹配,我应该用什么来代替?

$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><!--:-->' 

而且我想用

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

消除<!--:fr--><!--:-->但它返回相同的字符串$。问题是什么?

+0

当模式被固定,那么为什么不用'str_replce'试试? – diEcho 2011-05-25 05:14:15

+0

typo'str_replace' – Ibu 2011-05-25 05:15:07

+0

'\ w'仅匹配字母,数字和下划线。它不符合“<" or ">”。 – 2011-05-25 05:09:28

回答

3

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

您也可以使用.s标志。

尝试......

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

Ideone

1

另一种可能性是,你只是删除你不想要的部分。

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

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

0

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

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

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

[\p{L}.,]+ 

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

相关问题