如何使用preg_replace忽略特定单词

时间:2018-06-29 13:06:32

标签: php

请考虑以下内容:

$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

1 个答案:

答案 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!>

Demo