1

preg_replace を使用して次のことが可能かどうかを判断しようとしています。可能であれば、コメント付きの例を示して、それから学びます。

次のようなhtmlコードがあります。

<ul class="sub-menu">
<li id="menu-item-99" class="menu-item"><a href="/clients-login-english/">Login**</a></li>
<li id="menu-item-100" class="menu-item"><a href="/clients-create-account-english/">Create Account%%</a></li>
</ul>

私がやりたいのは、「コード」の位置、この場合は「* *」または「%%」を見つけて、前の < li で始まり次の < /li > で終わるテキストを削除することです。したがって、これに preg_replace を使用して「**」を探している場合、次のようになります。

<ul class="sub-menu">

<li id="menu-item-100" class="menu-item"><a href="/clients-create-account-english/">Create Account%%</a></li>
</ul>

私の最初の考えは、ブルートフォースアプローチを使用し、stripos を使用して「**」を見つけ、そこから逆方向にループして < li を見つけ、その後に < /li > を探して、このセクションを除いた文字列を再構築することですが、もっと簡単な方法が必要なようです。

4

1 に答える 1

1

正規表現を使用して HTML を解析するとエラーが発生しやすいことを理解してください。取得している HTML テキストに確信が持てない限り、これは避けてください。

ここに、あなたが望むことを行うための正規表現ベースのコードがあると言いました:

$html = <<< EOF
<ul class="sub-menu">
<li id="menu-item-99" class="menu-item"><a href="/clients-login-english/">Login**</a></li>
<li id="menu-item-100" class="menu-item"><a href="/clients-create-account-english/">Create Account%%</a></li>
</ul>
EOF;
echo preg_replace('#<li\s.*?<a[^\*]+\*\*</a></li>#s', '', $html). "\n";

編集: 上記を達成するための DOM ベースの (および推奨) 方法は次のとおりです。

$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html); // loads your html
$xpath = new DOMXPath($doc);
$nlist = $xpath->query("//ul[@class='sub-menu']/li");

$nodesToDelete = array();
$numnodes = $nlist->length;
for($i=0; $i < $numnodes; $i++) {
   $node = $nlist->item($i);
   $val = $node->nodeValue;
   if (strstr($val, '**'))
      $nodesToDelete[] = $node;
}

foreach($nodesToDelete as $node)
   $node->parentNode->removeChild($node);

$newHTML =  $doc->saveHTML();
echo $newHTML;
于 2012-04-27T14:11:45.017 に答える