PHP正则表达式删除字符代码以外的所有数字

时间:2016-08-03 17:05:15

标签: php regex

根据this线程,从PHP中的字符串中删除所有数字非常容易。

例如:

$no_digits = preg_replace('/\d/', '', 'This string contains digits! 1234');

但是,我不希望删除数字,这些数字是HTML字符代码的一部分,例如:

)
©

如何让Regex忽略属于HTML字符代码的数字?即夹在&#;个字符之间的数字?

4 个答案:

答案 0 :(得分:3)

您可以使用(*SKIP)(*F)动词:

echo preg_replace('/&#\d+;(*SKIP)(*F)|\d+/', '', 
                  'This string contains digits! 1234 ) © 5678');
//=> This string contains digits!  ) ©

&#\d+;(*SKIP)(*F)将跳过匹配ID正则表达式匹配&#\d+;模式。

或者你可以使用lookarounds:

echo preg_replace('/(?<!&#)\d+|\d+(?!;)/', '',
                  'This string contains digits! 1234 &#41; &#169; 5678');

这意味着匹配1或数字之前没有&#或不跟;的数字,从而使其跳过&#\d+;模式。

答案 1 :(得分:0)

您可以使用

var output = Regex.Replace(input, @"[\d-]", string.Empty);

*** \d标识符只匹配任何数字字符。

答案 2 :(得分:0)

作为一个选项,您可以将代码转换为UTF-8编码(如果它不是UTF-8),然后使用html_entity_decode()将HTML实体转换为相应的字符,然后删除带有正则表达式的数字,然后,如果需要,再次使用htmlentities()将特殊字符转换为相应的实体(在UTF-8中,它实际上足以通过htmlspecialchars()转义特殊字符的最小子集),然后将代码转换回原始编码(如果原始字符串不是UTF-8)。

答案 3 :(得分:-1)

您可以使用后视并向前看。

$no_digits = preg_replace('/(?<!&#)\d+(?=[^;\d])/', '', 'This string contains &#41; digits! 1234');

基本上,(?<!&#)告诉RegEx查看\d+后面以确保没有&#(?=[^;\d])告诉RegEx先行\d+确保它不是分号或数字。

我更喜欢这个解决方案,因为它可以在Java和JavaScript等大多数RegEx上使用。

希望这有帮助。

编辑:错过一个字符<