php
  • regex
  • preg-match
  • 2016-04-09 17 views 0 likes 
    0

    を使用してWebページのメタ記述のアポストロフィを交換しますアポストロフィです。正規表現は、私は、このデータを持ってするpreg_match

    どのように私はそれをエスケープできますか?第三の選択肢は有効なHTMLではなく、すべてのことが起こるので、...あなたが正しいです

    <meta name="description" content="Some Content" /> 
    <meta name='description' content='Some Content' /> 
    <meta name=description content=Some Content /> 
    

    +0

    ...と属性値が単一引用符でラップされている場合、あなたは同じになります二重引用符を一致させるための問題でしょうか? [この回答を見る](http://stackoverflow.com/a/1732454/3294262) – fusion3k

    +0

    さらに、引用符のないメタの(可能ではない)オプションを考えてみましょう。 [この場合何が起こるかを見る](https://regex101.com/r/hQ1gB0/1)。 – fusion3k

    +0

    @fusion3k私はそれのためのフォールバック計画を持っています。 –

    答えて

    0

    あなたの正規表現は<meta>ノードのためにこれらの3つのオプションを検討してください。

    簡単な方法は、あなたのオリジナルの正規表現は、タグを閉じて?、貪欲ではない演算子使用して変更することです: - この場合も -

    <meta +name *=[\"']?description[\"']? *content=[\"']?(.*?)[\"']? */?> 
                     └─┘  └───┘ 
          search zero-or-more characters except following  closing tag characters 
    

    regex101 demo

    しかし、何が起こりますあなたがこのメタを持っていれば?

    <meta content="Some Content" name="description" /> 
    

    正規表現は失敗します。

    HTMLノード試合本当のするには、パーサーを使用する必要があります。

    $dom = new DOMDocument(); 
    libxml_use_internal_errors(1); 
    $dom->loadHTML($yourHtmlString); 
    $xpath = new DOMXPath($dom); 
    
    $description = $xpath->query('//meta[@name="description"]/@content'); 
    echo $description->item(0)->nodeValue); 
    

    意志出力:

    Some Content 
    

    はい、それは5行対1ですが、この方法では必要になります<meta name="description">に一致します(有効な属性ではない3番目の属性も含む場合もあります)。


    関連する問題