4

現在、この正規表現を使用して、文字列から英数字以外のすべての文字を置き換え、それらをダッシュ​​に置き換えています

$newString = preg_replace("/[^a-z0-9.]+/i", "-", $string);

これは、次の文字列に対して正常に機能します。

$string = "this will work fine";
$newString = "this-will-work-fine";

しかし、文字列の最後の文字が英数字ではない場合、疑うように一致して置換されます。

$string = "How can I fix this?";
$newString = "How-can-I-fix-this-";

この正規表現を改善して、次の出力を得るにはどうすればよいですか?

$newString = "How-can-I-fix-this";

正規表現はどちらの場合でも機能するはずです。別の関数を使用して文字列を切り詰めることができることはわかっていますが、理想的には 1 つの正規表現を使用したいと考えています。これは可能ですか?

4

5 に答える 5

6

PHP を使用しているため、一度に複数のパターンと置換を定義できます。簡単なデモを次に示します。

$string = "How can I fix this?";
$patterns = array('/[^0-9a-z.]+/i', '/[^0-9a-z.]+(?=$)/i');
$replacements = array('-', '');

echo preg_replace($patterns, $replacements, $string) . "\n";

これは次を印刷します:

どうすれば修正できますか

これは、実際には 2 つの連続した置換にすぎません。

$string = "How can I fix this?";

echo preg_replace('/[^0-9a-z.]+/', '-', preg_replace('/[^0-9a-z.]+$/', '', $string)) . "\n";
于 2013-01-21T21:28:42.880 に答える
2

あなたはいつでもできますtrim("-how-can-i-fix-this-", "-");

于 2013-01-21T21:33:26.457 に答える
2

これは2つのステップで行う必要があると思います。これは、2つの異なるケースがあるためです。文字列の最初と途中で、英数字以外の文字を「-」に置き換えます。最後に、それらを空の文字列に置き換えます。

于 2013-01-21T21:25:29.297 に答える
1

実際には、1 つの正規表現で実行できます。

$newString = preg_replace('/[^a-z0-9.]++([a-z0-9.]++)(?:[^a-z0-9.]++$)?/i', '-$1', $string);

ノート:

  • 今後の参考のために'-\1'、 、'-\\1'"-\\1"、および"-$1"はすべて、置換文字列の有効な代替手段です。
  • この場合、所有量指定子は実際には必要ありません。ただし、速度の向上がごくわずかであっても、常に使用しています。

編集:

3 番目のケース (最初の文字が英数字ではない) も、1 つの正規表現で実行できます。

$newString = preg_replace('/(?:^[^a-z0-9.]++([a-z0-9.]++))?[^a-z0-9.]++([a-z0-9.]++)(?:[^a-z0-9.]++$)?/i', '$1-$2', $string);

于 2013-01-21T22:02:22.730 に答える
0
$string = 'How can I fix this?';
$string = trim(preg_replace('/[^A-Za-z0-9]/', '-', $string), '-'); 

英数字以外をすべて に置き換えて'-'から、端からトリムします。

于 2013-01-21T23:06:13.217 に答える