如何从字符串中删除 PHP 中包含非字母字符的单词?

How to remove words in PHP that contain Non-Alphabet characters from a string?

如何从包含非字母表字符的字符串中删除整个单词?

编辑 但是,'- 应该是唯一允许与字母表一起使用的字符。

例如:This is a? #test e3ample

变为:This is

我找到的解决方案侧重于从字符串中删除特定字符而不是整个单词。

我曾尝试创建一个包含禁用字符的数组,但这是不好的做法。我将如何使用正则表达式来做到这一点?或者类似的东西。

我们可以尝试使用以下模式进行正则表达式替换:

(?=[^ ]*[^A-Za-z \'-])([^ ]*)(?:\s+|$)

这使用先行检查每个单词是否包含非字母字符。如果是这样,那么它将删除整个单词。也允许使用破折号和单引号。

$input = "H3llo This is a? #test e3ample of a sentence-word bl&h.";
echo preg_replace('/(?=[^ ]*[^A-Za-z \'-])([^ ]*)(?:\s+|$)/', '', $input);

This is of a sentence-word

Demo

编辑:

如果将来某个时候您需要将允许的字符添加到您的列表中(破折号和单撇号除外),那么只需将它们添加到字符 class 中即可。例如。还允许句点和逗号然后使用此模式:

(?=[^ ]*[^A-Za-z \'.,-])([^ ]*)(?:\s+|$)

简单地为符合"word"定义的连续字符写一个匹配,例如:

  • 任何非空格字符\S*
  • 允许字符的否定列表[^-a-z\s]加上space
  • 非空格字符\S*

诀窍在于任何非space 字符串都会被匹配,只要它包含一个不在允许集合中的字符。

根据我的测试,这个模式是最精简的,因为它避免了环视和捕获组。如果它不适用于所有情况,请给我评论打破它的字符串。

演示:https://regex101.com/r/h9w3xn/5

模式:

/\S*[^a-z '-]\S* | \S*[^a-z '-]\S*/i

(无替换字符串)

这将匹配无效的子字符串和前导或尾随 space(但绝不会同时匹配)以生成干净的输出字符串。

有人可能会评论说这不是一个非常 DRY 的模式,因为它会自我重复,但优点是:效率和我认为的可读性。

来自我的回答 phone;如果我错了,请纠正我。