根据this线程,从PHP中的字符串中删除所有数字非常容易。
例如:
$no_digits = preg_replace('/\d/', '', 'This string contains digits! 1234');
但是,我不希望删除数字,这些数字是HTML字符代码的一部分,例如:
)
©
如何让Regex忽略属于HTML字符代码的数字?即夹在&#
和;
个字符之间的数字?
答案 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 ) © 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 ) digits! 1234');
基本上,(?<!&#)
告诉RegEx查看\d+
后面以确保没有&#
和(?=[^;\d])
告诉RegEx先行\d+
确保它不是分号或数字。
我更喜欢这个解决方案,因为它可以在Java和JavaScript等大多数RegEx上使用。
希望这有帮助。
编辑:错过一个字符<
。