2017-09-06 22 views
0

preg_replaceを実行するエレガントな方法があるかと疑問に思っていましたが、まだ置き換えられているものはpreg_replaceです。preg_replace - 置き換えられたものを変数に置き換えた

例として、ランダムなサイトのHTMLを含む文字列を想像してください。私はさらなる処理のためにその文字列から<head>を削除し、さらに<head>要素の内容を余分な変数(たとえばメタフラグの解析用)に保持したいと思います。

私は(グローバル変数を使用せずに)それを行うには二つの可能性を考えることができます。

if (preg_match('%<head>(.*?)</head>%ism', $html, $matches)) { 
    $html = preg_replace('%<head>(.*?)</head>%ism', '', $html); 
    $head = $matches[1]; 
} 

この1つは理想的ではありません二回正規表現を実行しなければなりません。

$head = ''; 
$html = preg_replace_callback(
     "%<head>(.*?)</head>%ism", 
     function ($match) use (&$head) { 
      $head .= $match[1]; 
      return ''; 
     }, 
     $html 
); 

もっとエレガントで効率的な方法があるのだろうかと思っていました。

+0

@WiktorStribiżew彼はそのシナリオでどのように試合をキャプチャしますか? – Steve

+0

私は最初のものに行くだろう。私はもっ​​と良い方法はないと思っていますが、あなたは 'str_replace'を使って2回目の正規表現を自分自身で保存することができます – apokryfos

+0

私はあなたがマッチを保存していることに注意しませんでした。 2番目の方法が最も効率的です。 –

答えて

2

あなたは物事をしようとしています:ヘッドのコンテンツを取得し、ヘッドのコンテンツを削除します。 2つの(類似しているが異なる)別々のものを1つにマージしようとすると、欲求不満の原因となるだけです。

私はあなたの2つの提案されたオプションの最初に行くだろうが、正規表現を変数に入れ、正規表現を2回タイプする代わりに再利用する。後で簡単に変更できます。

しかし、もう一度、パーサーの使用を検討しましたか?

$dom = new DOMDocument(); 
$dom->loadHTML($html_source_here); 
$headelement = $dom->getElementsByTagName('head')[0]; 
$headhtml = $dom->saveHTML($headelement); 
$headelement->parentNode->removeChild($headelement); 
$result = $dom->saveHTML(); 

今、あなたは(その上にある任意の属性を持つ完全<head>...</head>ラッパーが含まれます)$headelement、および削除<head>とHTMLの両方を持っています。

関連する問題