1

私は何かを見落としていると確信していますが、phpを使用して文字列の配列で単純な一致を試みています.

私の配列は、コミックのタイトルとそれに続く号番号で構成されています

$comics = array('blah blah #13', 'more blah #3', 'more more blah #10');

#1 の問題を見つけて、#10 と #13 の問題を無視したい。

私のコード

foreach ($comics as $child) {

 $kw = "#1"
 if(preg_match("/\b".preg_quote($kw)."\b/i", $child) {
  do some stuff
 }
 else {
       do other stuff
 }
}

私は正規表現の初心者ですが、\b は #10、#12 などを除外する単語の境界のようなものだと確信しています。

助けてくれてありがとう

4

3 に答える 3

0

ループを回避preg_grepして、次のように使用できますregex

$comics = array('blah blah #13', 'more blah #1', 'more more blah #10');
print_r(preg_grep('/#1(?=\D|$)/', $comics));

出力:

Array
(
    [1] => more blah #1
)
于 2013-10-07T20:16:16.070 に答える
0

サンプル タイトルに基づいて、問題番号は文字列の最後の部分です。それが常に当てはまる場合は、次の正規表現を使用できます。

/#1$/

例:

if(preg_match("/#1$/", $child) {
    // #1 issue!
} else {
    // not the #1 issue
}

問題番号の後に追加のテキストが続く可能性がある場合、これは の使用によって示唆されています\b。現在使用している正規表現をわずかに変更して、 の後に番号を付けることはできないことを示すことができます#1

$kw = "#1[^0-9]"
if(preg_match("/\b" . $kw . "\b/i", $child) {

これを行うと、標準の単語文字を許可できます (たとえば、 の後a-zに続きます#1が、別の数字は許可しないため、#10 や #153 は無視します)。の後に続くことができない文字を などに追加することで、無視リストを拡張し続けることができ#1ます$kw = "#1[^0-9a-z.,]";

同様に続くことができる一連の文字を指定することは、より興味深いかもしれません#1(簡潔にするために、ここでは正規表現のみ):

\b#1(?:[.;, ]|$)

この正規表現は、任意の#1後にピリオド、セミコロン、コンマ、スペース、または行末が続きます。これは、 に続く文字のリストがあるが#1、より広い範囲の文字セットを禁止したい場合に便利です。

于 2013-10-07T20:19:04.223 に答える