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

如何从字符串中删除PHP中包含非字母字符的单词?,php,regex,string,alpha,Php,Regex,String,Alpha,如何从包含非字母表字符的字符串中删除整个单词 编辑但是,'和-应该是字母表旁边唯一允许的字符 例如:这是一个#测试样本 变成:这是 我找到的解决方案主要是从字符串中删除特定字符,而不是整个单词 我尝试过用被禁止的角色创建一个数组,但这是一个糟糕的做法。我将如何使用Regex?或者类似的东西。我们可以尝试用以下模式替换正则表达式: (?=[^ ]*[^A-Za-z \'-])([^ ]*)(?:\\s+|$) 这将使用前瞻检查每个单词是否包含非字母字符。如果是这样,那么它将删除整个单词。也允许使

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

编辑但是,
'
-
应该是字母表旁边唯一允许的字符

例如:
这是一个#测试样本

变成:
这是

我找到的解决方案主要是从字符串中删除特定字符,而不是整个单词


我尝试过用被禁止的角色创建一个数组,但这是一个糟糕的做法。我将如何使用Regex?或者类似的东西。

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

(?=[^ ]*[^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

编辑:

如果将来需要将允许的字符添加到列表中(除了破折号和单撇号),那么只需将它们添加到character类中即可。例如,要同时允许句点和逗号,请使用此模式:

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

只需为不符合“单词”定义的连续字符编写匹配项,例如:

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

诀窍是任何非空格字符串都将得到匹配,只要它包含一个不在允许范围内的字符。

根据我的测试,这种模式是最精简的,因为它避免了查找和捕获组。如果它不适用于所有情况,请向我评论断开它的字符串

演示:

模式:

/\S*[^a-z '-]\S* | \S*[^a-z '-]\S*/i
(无替换字符串)

这将匹配无效的子字符串和前导或尾随空格(但决不能同时匹配两者),以生成干净的输出字符串

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


接听我的电话;如果我错了,请纠正我。

从上面的字符串中,您会删除什么?@rtfm因此,任何包含字母表中除字母以外的任何内容的单词都将被删除。例如,如果一个单词同时包含字母和数字(或特殊字符),则应将其删除。我现在已经做了编辑,谢谢你指出这一点!连字符单词?你想删除标点符号吗?@rtfm
-
'
应该是允许的。我将更新问题详细信息以添加这些信息?例如,Café用有效的
blah
和一个句号来尝试您的演示。邦。因为我想没有词的界限。。。等等,OP想要这样吗?对我来说似乎很草率。@mickmackusa
然而,'和-应该是字母表旁边唯一允许的字符。
。。。一周内不允许使用句号。“砰”是一个粗鲁的评论。我错了。道歉。对不完整问题的正确回答-无编码尝试。