3

質問の表現が不十分である場合は申し訳ありません(またはすでに質問されている場合。私は本当にそれを見つけようとしました)。

文字クラスの特定の文字がたまたま最後の文字である場合 (他の場所に残っている可能性があります)、それを一致から除外することは可能ですか? 私が取り組んでいるのは、より大きな文字列で URL を見つけることと似ており、パターンにピリオドを含める必要がありますが、最後の文字がピリオドの場合は、文の終わりとして除外します。

したがって、パターン(他のURLのもの)では「(/ [a-zA-Z0-9._-] *)?」存在する場合、最後の期間のみを除外する方法はありますか? 上記は具体的にはドメインの後の uri セグメントですが、一致させたいのは

"/some_uri/segments.php"

両者に

"www.domain.com/some_uri/segments.php" 

"www.domain.com/some_uri/segments.php."

複数のピリオドが uri に存在することを許可します。

上記が明確でない場合は、単語の最後の文字が「z」である場合にのみ、単語の最後の文字を除外する方法を求めていると想像してください。したがって、'dozzer' と 'dozzerz' は両方とも、文構造内で 'dozzer' として一致します (文字列の END の位置には一致しません)。先読みなどで遊んでみましたが、まだ方法が見つかりません。(単一の正規表現で)それが不可能かどうか疑問に思っています。

御時間ありがとうございます!

編集

明確にしておらず申し訳ありませんが、テキストのブロック内で一致を実行する必要があります。私がやっていることは、テキストを調べてすべての Web アドレスを見つけ、それらにマークアップを適用することです。したがって、$ などの位置演算子を使用して文字列の末尾を一致させることはできません。これが最大の問題でした。

この後に機能する回答を他の誰かが投稿しない限り、M477h3w1012に同意し、正規表現だけでは達成できないと結論付けなければならないと思います。一致を見つけた後、条件付きチェックを実行して、末尾にピリオドがあるかどうかを判断する必要があります。しかし、もう一度、お時間とご協力をいただき、誠にありがとうございました。:-)

4

3 に答える 3

1


単一の正規表現チェックでそれが可能だとは思いません...誰かがそれについて私を修正できるかもしれませんが、現時点ではそうは思いません(または、現時点で最適化することは考えられません)。

一方、できることは、チェックを実行することです。最初に初期置換関数を使用して入力を実行し、最後にドットがあるかどうかを確認し、ドットがある場合はそれを置き換えます。そこから、前の正規表現を介してフィードすることができます。

だから、これはそれが行くことができる方法です...

function dotCheck( $url ) {
  $noDotURL = preg_replace( '/\.+$/', '', $url );
  return $noDotURL;
}

urlCheck( dotCheck( $_POST['form'] ) );

urlCheck は、有効なリンク構造であるかどうかを確認するための主なチェックです。冗長形式の正規表現は、リンクの最後の文字としてドットをチェックし、それらを削除します。これは、誰かがhttp://www.google.comと入力した場合に機能するはずです。またはhttp://www.google.com .....

幸せなスクリプト。

于 2013-07-15T01:53:16.607 に答える
1

はい。一般的には、次のようにします。

(<stuff you want to match>)(<character to exclude if at the end>)?$

<stuff you want to match>が量指定子で終わる場合、除外された最後の文字が存在する場合に一致するように、その量指定子は非貪欲である必要があります。

次に、最初の一致グループ ( $1変数) を使用します。

ただし、正規表現には他にもいくつか問題があります。

  • 複数に一致させたい場合は、文字クラスに/を含める必要があります。それ以外の場合は、最初から/次の直前まで一致しています。
  • なぜあなたが持っているのかわからない最後に。これにより、すべてがオプションになります。

この正規表現は、あなたが説明したことを達成します:

(/[a-zA-Z0-9._/-]*?)(\.)?$

一致変数$1には、最初の/から最後までのすべてが含まれますが、最後のドットがある場合は除外されます (ドットは$2にあります)。

于 2013-07-15T02:25:48.710 に答える
0

編集: Adi Inbar が気づいたように、あなたの目標はパターンを失敗させることではなく、文字列の末尾または単語の末尾にある特定の文字を除外することです:

単語の末尾にある 'z' を除外するには: (末尾のいくつかの 'z' も除外されます)

文字クラスと所有量指定子を使用:

(?>[^\Wz]++|z++\B)+ # the most performant way

「.」を除外するには at a end of a string : (末尾の複数の「.」も除外されます)

先読みで:

^.+?(?=\.*$)

または、文字クラスと所有量指定子を使用して:

(?>[^.]++|\.++(?!$))+

この式は、必要なより具体的な文字クラスに簡単に適応できることに注意してください。たとえば[\w.-]、uri の場合は次のようになります。

$pattern = '~(?>/[\w.-]++)*/(?>[\w-]++|\.++(?!$))+/?~';
于 2013-07-15T01:54:21.470 に答える