PHP正则:移除字符串中以连字符/空格包裹的指定词汇
问题描述
需要移除字符串中满足以下条件的指定词汇(in、في、فى):
- 词汇前后为空格(如单独的
in) - 词汇前后为连字符(如
-in-)
已尝试的代码:
$string = 'inline things in inline workin workin AND inline-things-in-inline-workin-workin فيلا فيلا في انفيلا انفي انفي AND فيلا-فيلا-في-انفيلا-انفي-انفي'; $array_of_words = ['in' , 'في' , 'فى']; // I tried echo _remove_words($string , $array_of_words); function _remove_words($string , $array_of_words){ $string = preg_replace('/(?<=^|[^\p{L}])' . implode('|',$array_of_words) . '(?=[^\p{L}]|$)/ui','',$string); return $string; }
当前正则未达到预期效果,预期输出为:
inline things inline workin workin AND inline-things-inline-workin-workin فيلا فيلا انفيلا انفي انفي AND فيلا-فيلا انفيلا-انفي-انفي
也曾尝试其他正则模式:
'/#-' . implode('|',$array_of_words) . '-#/ui' '/^-' . implode('|',$array_of_words) . '-$/ui'
解决方案
原正则的问题在于匹配替换后会产生连续的空格或连字符,需要补充处理这类冗余字符。同时要注意对特殊字符转义,避免正则匹配异常。以下是修正后的实现:
$string = 'inline things in inline workin workin AND inline-things-in-inline-workin-workin فيلا فيلا في انفيلا انفي انفي AND فيلا-فيلا-في-انفيلا-انفي-انفي'; $array_of_words = ['in' , 'في' , 'فى']; echo _remove_words($string , $array_of_words); function _remove_words($string , $array_of_words){ // 对目标词汇进行正则转义,避免特殊字符干扰 $escaped_words = array_map(function($word) { return preg_quote($word, '/'); }, $array_of_words); $words_pattern = implode('|', $escaped_words); // 匹配前后为非字母的目标词汇(覆盖空格、连字符、字符串边界场景) $string = preg_replace("/(?<=^|[^\p{L}])($words_pattern)(?=[^\p{L}]|$)/ui", '', $string); // 处理替换后产生的连续空格,合并为单个空格 $string = preg_replace('/\s+/', ' ', $string); // 处理替换后产生的连续连字符,合并为单个连字符 $string = preg_replace('/-{2,}/', '-', $string); // 去除字符串首尾可能存在的冗余空格 return trim($string); }
逻辑说明
- 正则转义:对目标词汇中的特殊字符进行转义,确保正则匹配准确。
- 匹配目标词汇:使用
(?<=^|[^\p{L}])和(?=[^\p{L}]|$)确保只匹配前后为非字母字符的目标词汇,避免误删单词内部的子串(如inline中的in)。 - 清理冗余字符:替换后可能出现连续空格或连字符,通过正则将其合并为单个字符,保证输出格式整洁。
内容的提问来源于stack exchange,提问作者Mohamed-Yousef
相关产品推荐
相关产品推荐

