19720

[code]

        foreach ($xpath->query('//a[contains(@href,"yahoo")]') as $node) {
            $node->parentNode->removeChild($node);//そのタグを消す
        }
    
[/code]

PHP HTMLパースの話です。  
上記で a タグの href要素に yahoo を含むものが、そのタグ毎削除できるのはわかります

同様に複数削除したいキーワードがある場合に  
$varArr にキーワードを含む配列を作り、次のように書きましたが  
Warning: DOMXPath::query(): Invalid expression in （そのPHPの場所）～～  
のエラーがでます。  
エラーの内容を調べると "' を使ってはいけない、らしいですが  
String型の配列を作る場合、" ' は必要になりますよね？どう回避するのでしょうか。

できれば削除すべきキーワードは１つの変数に保持したいため  
逐一 最初の行のプログラムをかき回すのでなく、for文等で処理したいと考えます。

どのようにすれば良いでしょうか？

[code]

    $varArr = array("yahoo","google","livedoor","keyword3");
    for($i=0;count($varArr)>$i;$i++){
        foreach ($xpath->query('//a[contains(@href,$varArr[$i])]') as $node) {
            $node->parentNode->removeChild($node);
        }
    }
    
[/code]


CC BY-SA 3.0
2015-12-07T12:12:40.447
19718
2015-12-08T04:18:24.853
12608
question
php
PHP 特定のタグを消したい　（キーとなる言葉を複数）


`$xpath->query('//a[contains(@href,$varArr[$i])]'`  
の部分を  
`$xpath->query("//a[contains(@href,$varArr[$i])]"`  
のように変更します。  
これは、`' '`と`" "`で埋め込み変数の展開が異なるためです。  
（`' '`の場合は展開されない）

以下を試してみるとわかりやすいと思いいます。

[code]

    $varArr = array("yahoo","google","livedoor","keyword3");
    for($i=0;count($varArr)>$i;$i++){
        print '$varArr[$i]' . "$varArr[$i]\n";
    }
    
[/code]


CC BY-SA 3.0
2015-12-07T12:37:44.637
19720
2015-12-07T12:37:44.637
5044
19718
answer


XPathに直接変数を埋め込まない方がいいよ。

[code]

    $varArr = array("yahoo","google","livedoor","keyword3");
    foreach ($xpath->query('//a') as $node) {
        foreach ($varArr as $v) {
            if (strpos($node->getAttribute('href'), $v) === false) {
                continue;
            }
            $node->parentNode->removeChild($node); //そのタグを消す
            break;
        }
    }
    
[/code]


CC BY-SA 3.0
2015-12-08T04:18:24.853
19747
2015-12-08T04:18:24.853
62
19718
answer