正则表达式字母数字,标点符号为1个字

时间:2017-11-10 01:41:47

标签: php regex

我将每个单词与相同的段落词匹配。

更新1 :我意识到只接受您需要的标点符号无法解决此问题。

示例'hello-'和'hello',被认为是单独的单词。

有没有办法在单词和单独标点之前和之后删除标点符号?只允许在单词内标点符号。

$string="_ - – hello’ hello' hello, hello- world. he,llo hello-world hello_world hel-lo-world hello9world"; 

输出应为

hello hello hello hello world he,llo hello-world hello_world hel-lo-world hello9world

单词中只有单词或标点符号

更新2 :如果单词中只有单词或标点符号,则十进制数会有问题。

1.0仍然可以,.1作为标点符号删除之前和之后,将变为1而不是0.1

更新3 :接受单词中的标点符号, 子字符串以字母或数字开头或结尾都会有问题。 20岁将成为'20 - ''岁'。

感谢mickmackusa。

1 个答案:

答案 0 :(得分:1)

模式:/[a-z\d]+(?:[-_’',.][a-z\d]+)*/iuPattern Demo

此模式要求所有匹配的子字符串以字母或数字开头。子字符串可以包含标点符号(字符类[-_’',.]中的任何一个),但必须紧跟一个或多个字母或数字。 *表示前面的括号表达式中的零个或多个,因此子字符串可以是有效的,无论它们是否包含非字母数字字符。

此模式与两个连续的非字母数字字符作为一个匹配的子字符串不匹配。例如:20--what不会返回20--what,而是20what

*如果你想在字符串中间允许任何非空格字符,你可以使用: /[a-z\d]+(?:\S[a-z\d]+)*/iu

i标志允许[a-z]匹配大写字母。
u标志允许使用之类的unicode字符。

PHP代码:(Demo

$string="_ - – hel’lo’ hel'lo' .1 1.0 1. hello, hello- world. he,llo hello-world hello_world hel-lo-world hello9world -20 20- 20-year -20year- -20-year- 20-year-old 20-yearold 20year-old 20-year-old-old 20-20-year-20-old-";
echo preg_match_all("/[a-z\d]+(?:[-_’',.][a-z\d]+)*/iu",$string,$out)?implode(' ',$out[0]):'fail';

输出:

hel’lo hel'lo 1 1.0 1 hello hello world he,llo hello-world hello_world hel-lo-world hello9world 20 20 20-year 20year 20-year 20-year-old 20-yearold 20year-old 20-year-old-old 20-20-year-20-old