フィードしている html ファイルのサンプル テキストがpreg_match_all()
なければ、動作する正規表現を提供することはできません...
それでもなお、これはあなたを助けるかもしれません.
あなたのコード
preg_match_all("/[0-9]\s\=\s\'(.*?)\'\s\;/", $file, $matches);
print_r($matches);
for ($i = 0; $i < count($matches[0]); $i++) {
echo $matches[1][$i]."<br>";
}
最初に気付くのは、for
ループcount($matches[0])
内で使用し、ループ内からエコーするときに$matches[1]
. の場合は必ずしも問題ではありませんがpreg_match_all
、なぜ最後まで使用しなかったcount($matches[1])
のですか?
2 番目に質問する必要があるのは、ファイルを開いてプレーン テキストを取得しましたか? 何かのようなもの:
$file = file_get_contents('/path/to/file.html'); //For example
さて、あなたの正規表現のために...
[0-9]
単一の数字に一致します
\s
SPACE、TAB、NEW_LINE などの任意の空白文字に一致します。
\=
マッチ=
\'
マッチ'
\;
マッチ;
(.*?)
任意の文字に 0回以上一致し、キャプチャします
注:後で詳しく説明するように、正規表現のクエスチョン マークは、最も早い機会に一致を停止するため、重要です。
今後
正規表現は機能し、必要なものを提供しますが、世界で最も読みやすいものではありません。
合わせる:0 = 'something to be captured in here' ;
以下を使用できます。/\d = '(.*?)' ;/
=
、、'
およびをエスケープする必要はありません;
。また\d
、の別名な[0-9]
ので、同じ意味で使用できます (ただし、\d
文字数が少なく読みやすい)。スペースを入力するだけでも使用する必要はありません\s
(前述のような他の空白文字を含める必要がある場合を除きます)。
使用例は次のとおりです。
$string = "some text before 0 = 'captured by regex' ; some text afterwards...";
preg_match_all("/\d = '(.*?)' \;/", $string, $matches);
var_dump($matches);
/**
Output from var_dump
array(2) {
[0]=> array(1) {
[0]=> string(27) "0 = 'captured by regex' ;"
}
[1]=> array(1) {
[0]=> string(19) "captured by regex"
}
}
*/
次に、一致したテキストを次のように反復処理できます。
for($i = 0; $i < count($matches[1]); $i++){
echo $matches[1][$i], "<br>";
}
クエスチョンマークについて
?
についてのポイントと、なぜそれが必要なのかを明確にするためです。
一般に、正規表現はソース テキストを可能な限り継続しますが、状況によっては (これが含まれます)、問題が発生する可能性があります。
?
-(.*)
の代わりに-なしで正規表現を使用した場合、正規(.*?)
表現は最初からX = '
最後まで' ;
一致し、一致する予定のキャプチャ グループのいくつかが必然的に含まれます。ただし、を使用する?
と、(この場合)の最初のインスタンスで停止するように正規表現に指示されます' ;
。
コード' ;
の最後に を追加し、 .$string
?