我正在尝试从字符串中删除字符[' - ],但不是在字符串以"' 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"找到除了字符串开头以外的任何地方"'"将被删除。
答案 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