有条件地从字符串中删除字符

时间:2014-05-29 23:01:13

标签: php regex preg-match

我正在尝试从字符串中删除字符[' - ],但不是在字符串以"' t'开头时。目前的代码:

$name = "'-'-''t van t der Reidjen--'-'-";
$name = preg_replace( '~(^|\s)[-\']+(?!t )(\s|$)~', ' ', $name );

期望的结果:

 "'-'-''t van t der Reidjen--'-'-" =>  "'t van t der Reidjen"
 "van 't der Reidjen--'-'-" => "van t der Reidjen"
 "-van - der -'- Reidjen-" => "van der Reidjen"

即。它会永远离开"&#t; t"在字符串的开头,即使它带有许多[ - ']字符的前缀,但是如果"' t"找到除了字符串开头以外的任何地方"'"将被删除。

3 个答案:

答案 0 :(得分:2)

这个怎么样:

/([-]+)|((?!'t)['])/g

<强> Online Demo

上面的表达式将-'分开,因为棘手的'然后使用预先排除文本中的't

(?!'t) 负面展望 - 排除't次匹配。

注意:这些字符't的区分大小写。

答案 1 :(得分:1)

如果我正确理解了你想要的东西,这应该可以解决你的问题:

/([-]+|(?!^)[']+)\s*/g

此正则表达式将匹配任何-一个或多个时间或'一个或多个时间,如果由于negated lookahead (?!)而不在字符串的开头。为了避免字符串中出现不需要的空格,特殊字符\s将在*-之后匹配零个或多个(')。

希望它有所帮助。

答案 2 :(得分:0)

$name = "'-'-''t van ----''' 't der-Reidjen--'-'-";
$name = preg_replace( "/^['-]+(?!t)/", '', $name );
$name = preg_replace( "/ ['-]+ /", ' ', $name );
$name = preg_replace( "/['-]+$/", '', $name );
$name = preg_replace( "/ '([^']) /", ' \\1 ', $name );
echo $name;

结果:'t van t der-Reidjen