フィードしている 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]単一の数字に一致します
\sSPACE、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?