请考虑以下内容:
$string = "Hello, there! Welcome to <>?@#$!& our site<!END!>";
我正在尝试删除除字母,数字,空格和“特殊标签” <!END!>
使用preg_replace,我可以这样写:
$string = preg_replace("/[^A-Za-z0-9 ]/", "", $string);
除去字母(大写和小写),数字和空格以外的所有内容。现在,如果我也想忽略<!END!>
标签,理论上我可以这样写:
$string = preg_replace("/[^A-Za-z0-9 <!END!>]/", "", $string);
但是,这不会特别忽略标签<!END!>
,而是忽略其中包含的任何字符。因此它将保留每个<,>和!在$ string中。
结果:
"Hello there! Welcome to <>! our site<!END!>"
但是我想得到:
"Hello there Welcome to our site<!END!>"
根据我的研究,应该可以使用\ b标记在preg_replace中包含要忽略的特定单词,但是"/[^A-Za-z0-9 \b<!END!>\b]/"
的结果与我相同。
我做错什么了吗?
实时演示:http://sandbox.onlinephpfunctions.com/code/219dc36ab8aa7dfa16e8e623f5f4ba7f4b4b930d
答案 0 :(得分:1)
您可以使用(*SKIP)(*F)
解决方案:
<!END!>(*SKIP)(FAIL)|[^A-Za-z0-9 ]
那将匹配:
<!END!>(*SKIP)(FAIL)
匹配<!END!>
,然后跳过该匹配|
或[^A-Za-z0-9 ]
不使用字符类中指定的字符进行匹配例如:
$string = "Hello, there! Welcome to <>?@#$!& our site<!END!>";
$string = preg_replace("/<!END!>(*SKIP)(FAIL)|[^A-Za-z0-9 ]/", "", $string);
echo $string;
这将导致:
您好,欢迎来到我们的网站<!END!>