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


Conditionally Strip Characters From String

我试图从字符串中删除字符 ['-],但当字符串以"'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)['])/g

在线演示

上面的解释将-'分开,因为棘手的',然后使用展望排除文本中的't

(?!'t) 负面展望未来 - 不包括't比赛。

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

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

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

此正则表达式将匹配任何-一次或多次,如果由于否定的前瞻 (?!( 而未在字符串的开头,则'一次或多次匹配。为了避免字符串中不需要的空格,特殊字符's将在-'之后匹配其中的零个或多个(*(。

希望对您有所帮助。

$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;

Result: 't van t der-Reidjen