0

私は以下が何をしているのか知っていると思いますが、確認したい仮定をしたくありません。

正規表現は次のとおりです。

$value = preg_replace(array('/[^a-z0-9_ -]/', '/[ -]+/', '/^-|-$/'), array('', '-', ''), $str);

配列の最初の部分は単純で、az、0〜9、アンダースコア、スペース、およびハイフン以外のものを何も置き換えません。スペースの後のハイフンはエスケープされるべきではありませんか?

2番目の部分はよくわかりません....1つ以上のスペースまたは1つ以上のハイフンを1つのハイフンに置き換えると言っていると思いますか?私は正しいですか?しかし、繰り返しますが、ハイフンをエスケープしますか?

3番目の部分は少し紛らわしいです.....|正規表現の文字はOR演算子ではありませんか?では、ハイフンまたはハイフンを何も置き換えないでください。がエスケープされた場合、|文字列全体が一致-|-し、何も置き換えないようにする必要があるため、それを読み取りますか?

最後に.....私はそれがそれらを得る位置で交換を処理するという私の考えで正しいですか?したがって、最初に配列の最初のスポットを処理してから、文字列の残りの部分で2番目と3番目に移動します。たとえば、最初の置換で何かが置換された場合、2番目の置換は文字列の改訂バージョンで機能しますか?

4

3 に答える 3

1

最初の置換後、文字列には文字、数字、スペース、アンダースコア、およびハイフンのみが含まれます。2 番目の置換では、連続するすべてのスペースやハイフンが 1 つのハイフンに変わり、3 番目の置換では、文字列の先頭または末尾からハイフンが削除されます。

他のコメント:

  • 文字クラスの先頭または末尾にハイフンを配置する場合、文字クラスでハイフンをエスケープする必要はありません。
  • 3 番目の正規表現/^-|-$/にはアンカー^$があり、それぞれ文字列の先頭と文字列の末尾を意味します。したがって、この正規表現は 1 つのハイフンに一致しますが、それが文字列の先頭または末尾にある場合に限ります。
于 2012-10-31T19:04:33.207 に答える
1

ハイフンが文字列の末尾または先頭にある場合、ハイフンをエスケープする必要はありません。

2 番目の部分は、連続するスペースまたはハイフンの任意の文字列に一致します (それらが混在していても)。

^-3 番目の部分は、文字列の先頭 ( ) または文字列の末尾( )にあるハイフンに一致します-$

これにより、文字、数字、アンダースコア、スペース、ハイフンのいずれでもないすべての文字が削除されます。次に、連続するすべてのスペースとハイフンを 1 つのハイフンに短縮します。最後に、先頭または末尾のハイフンを削除します。

于 2012-10-31T19:05:10.880 に答える
0
  1. 英数字、スペース、_または-
  2. 連続するスペースまたは-1 つだけを置き換える-
  3. 先頭と末尾を削除-

@nickbが言ったように、ハイフンは、で区切られた文字のグループにない限り、エスケープする必要はありません[]

于 2012-10-31T19:05:00.037 に答える