我正在尝试在PHP中编写正则表达式,只是删除字母数字单词(包含数字的单词),而不是具有punctuation和类似特殊字符的数字(例如价格) ,电话号码等。)。
应删除的词语:
1st
,H20
,2nd
,O2
,3rd
,NUMB3RS
,Rüthen1
,Wrocław2
不应删除的字词:
0
,5.5
,10
,$100
,£65
,+44
,(20)
,123
,ext:124
,4.4-BSD
,
以下是目前的代码:
$text = 'To remove: 1st H20; 2nd O2; 3rd NUMB3RS; To leave: Digits: -2 0 5.5 10, Prices: $100 or £65, Phone: +44 (20) 123 ext:124, 4.4-BSD';
$pattern = '/\b\w*\d\w*\b-?/';
echo $text, preg_replace($pattern, " ", $text);
然而,它会删除包括数字,价格和电话在内的所有字词。
到目前为止,我还尝试过以下模式:
/(\\s+\\w{1,2}(?=\\W+))|(\\s+[a-zA-Z0-9_-]+\\d+)/ # Removes digits, etc.
/[^(\w|\d|\'|\"|\.|\!|\?|;|,|\\|\/|\-|:|\&|@)]+/ # Doesn't work.
/(\\s+\\w{1,2}(?=\\W+))|(\\s+[a-zA-Z0-9_-]+\\d+)/ # Removes too much.
/[^\p{L}\p{N}-]+/u # It removes only special characters.
/(^[\D]+\s|\s[\D]+\s|\s[\D]+$|^[\D]+$)+/ # Removes words.
/ ?\b[^ ]*[0-9][^ ]*\b/i # Almost, but removes digits, price, phone.
/\s+[\w-]*\d[\w-]*|[\w-]*\d[\w-]*\s*/ # Almost, but removes digits, price, phone.
/\b\w*\d\w*\b-?/ # Almost, but removes digits, price, phone.
/[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*/ # Almost, but removes too much.
我发现它(大多数通常都太具体)和其他网站,它们假设删除带有数字的单词,但它们不是。
如何编写一个简单的正则表达式,可以在不触及其他内容的情况下删除这些单词?
示例文字:
要删除:
1st
H20
;2nd
O2
;3rd
NUMB3RS
;离开:数字:-2 0 5.5 10,价格:100美元或65英镑,电话:+44(20)123分机:124,4.4-BSD
预期产出:
删除:; ; ;离开:数字:-2 0 5.5 10,价格:100美元或65英镑,电话:+44(20)123分机:124,4.4-BSD
答案 0 :(得分:4)
如何用零替换\b(?=[a-z]+\d|[a-z]*\d+[a-z]+)\w*\b\s*
?
演示:https://regex101.com/r/jA2fW3/1
模式代码:
$pattern = '/\b(?=[a-z]+\d|[a-z]*\d+[a-z]+)\w*\b\s*/i';
要匹配包含外来/重音字母的字母数字单词,请使用以下模式:
$pattern = '/\b(?=[\pL]+\d|[\pL]*\d+[\pL]+)[\pL\w]*\b\s*/i';
答案 1 :(得分:3)
您可以按照以下方式修改正则表达式以获得所需的输出。
$text = preg_replace('/\b(?:[a-z]+\d+[a-z]*|\d+[a-z]+)\b/i', '', $text);
要匹配任何语言的任何类型的字母,请使用Unicode属性\p{L}
:
$text = preg_replace('/\b(?:\pL+\d+\pL*|\d+\pL+)\b/u', '', $text);