0

次の状況:

$text = "This is some <span class='classname'>example</span> text i'm writing to
demonstrate the <span class='classname otherclass'>problem</span> of this.<br />";

preg_match_all("|<[^>/]*(classname)(.+)>(.*)</[^>]+>|U", $text, $matches, PREG_PATTERN_ORDER);

<span class='classname'>example</span>あるフィールドに「 」があり、別の「」にある配列($ matches)が必要です。しかし、ここで取得するのは、「」を含む1つのフィールドと<span class='classname'>example</span>「クラス名」を含む1つのフィールドです。

もちろん、他の一致の値も含まれている必要があります。

どうすれば正しい値を取得できますか?

4

2 に答える 2

0

DOM パーサーを使用したほうがよいでしょうが、この質問は、一般的に正規表現でキャプチャがどのように機能するかに関するものです。

マッチとして得ているのは、周りにclassname置いて捉えているからです。()それらは完全に不要なので、削除するだけです。同様に、それ.+をキャプチャしたくないので、周りにそれらを必要としません。

()キャプチャするのではなく、グループ化として含める必要があるグループがある場合は、そのグループで開始する?:とキャプチャされません。

于 2012-08-27T15:35:46.467 に答える
0

安全で簡単な方法:

$text = 'blah blah blah';

$dom = new DOM();
$dom->loadHTML($text);

$xp = new DOMXPath($dom);

$nodes = $xp->query("//span[@class='classname']");
foreach($nodes as $node) {
    $innertext = $node->nodeValue;
    $html =  // see http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument
}
于 2012-08-27T15:30:47.263 に答える