2

以下を一致させる必要があります。

-foo
foo-

しかし、私は一致したくありませんfoo-bar

\bハイフンの境界が合わないので使えません。私の目標は、ハイフンをスペースに置き換えることです。提案?

更新 1 (より良い例):

xxx yyy -foo foo- foo-bar zzz

私は文字列-foofoo-. アイデアは、これらのハイフンを削除することです。ハイフンは、単語をハイフンで区切ることです。つまり、その左右に単語があるはずです。そうでない場合、ハイフンは表示されません。

4

2 に答える 2

1

否定先読みと後読みを使用したソリューション:

$string = 'xxx yyy -removethis andthis- foo-bar zzz -andalsothis-';
$new_string = preg_replace('/(?<!\w)-(\w+)-(?!\w)|(?<!\w)-(\w+)|(\w+)-(?!\w)/', '$1$2$3', $string);
echo $new_string; // Output: xxx yyy removethis andthis foo-bar zzz andalsothis

/*
   (?<!\w) : Check if there is a \w behind, if there is a \w then don't match.
   (?!\w) : Check if there is a \w ahead, if there is a \w then don't match.
   \w : Any word character (letter, number, underscore)
*/

オンラインデモ

于 2013-04-19T22:15:48.023 に答える
0

私の解決策:^-|-$| -|-

Match either the regular expression below (attempting the next alternative only if this one fails) «^-»
   Assert position at the beginning of the string «^»
   Match the character “-” literally «-»
Or match regular expression number 2 below (attempting the next alternative only if this one fails) «-$»
   Match the character “-” literally «-»
   Assert position at the end of the string (or before the line break at the end of the string, if any) «$»
Or match regular expression number 3 below (attempting the next alternative only if this one fails) « -»
   Match the characters “ -” literally « -»
Or match regular expression number 4 below (the entire match attempt fails if this one fails to match) «- »
   Match the characters “- ” literally «- »
于 2013-03-27T22:57:45.130 に答える