以下のコードを修正、表示したいと思っているのですが私には難解すぎて困っています。
現在PHPで作成したRSSを配信しているのですが、その中で、もともとあるコードを加工したいと思っています。
(例)
▼現
<img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" alt="○○○" width="○○○" height="○○○" />出典:https://△△△.com
↓
▼改
上記現から改のように、imgタグのsrcとaltのみを残したまま<figure>内に入れ込み、かつ「出典」部分のテキストのみを<figcaption>内に入れ込むという正規表現、置き換え方法をご教示いただければ幸いです。
なお、出典直後の「:」は全角(:)と半角(:)の場合があります。
img直後は必ず「出典」文字列が付与されていますが改行タグやスペースが入っていることもあります。
preg_replaceをあれこれ試してみたものの見当違いな結果を連発し、困っていたところたどり着きました。
不足情報などありましたらお答えしますので何卒どうぞよろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
正規表現版 (変更に弱いですが,決め打ちであればこれで十分です)
php
1<?php 2 3$content = <<<EOD 4<img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" alt="○○○" width="○○○" height="○○○" />出典:https://△△△.com 5<img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" alt='xx oo' width="○○○" height="○○○" />出典:https://△△△.com 6<img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" width="○○○" height="○○○" />出典:https://△△△.com 7EOD; 8 9echo preg_replace_callback( 10 '@<img( class="aa bb cc etc".*?) />\s*+([^\s<]*+)@s', 11 function ($m) { 12 $m[1] = preg_replace('@ 13 \s*+(?: 14 (?:src|alt)(*SKIP)(*FAIL)|[\w-]++ 15 )=(?:"[^"]*+"|\'[^\']*+\') 16 @x', '', $m[1]); 17 return "<figure><img$m[1]><figcaption>$m[2]</figcaption></figure>"; 18 }, 19 $content 20);
DOM版 (細かい差異に依存しないので変更により強いです)
(ただしインデントが崩れたり一部文字がHTMLエンティティに置換されてしまうなど,少し弊害があります…)
php
1<?php 2 3// 何かこれらを括っている親要素があると仮定 (もしなければ付加してください) 4$content = <<<EOD 5<root> 6 <img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" alt="○○○" width="○○○" height="○○○" />出典:https://△△△.com 7 <img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" alt='xx oo' width="○○○" height="○○○" />出典:https://△△△.com 8 <img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" width="○○○" height="○○○" />出典:https://△△△.com 9</root> 10EOD; 11 12$dom = new DOMDocument; 13libxml_use_internal_errors(true); 14$dom->loadHTML( 15 mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'), 16 LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD 17); 18libxml_clear_errors(); 19$xpath = new DOMXPath($dom); 20 21foreach ($xpath->query('//img[@class="aa bb cc etc"]') as $i => $node) { 22 23 foreach ($xpath->query('./@*[not(name()="src")][not(name()="alt")]', $node) as $attr) { 24 $node->removeAttribute($attr->name); 25 } 26 27 if ($textnode = $node->nextSibling and $textnode->nodeType === XML_TEXT_NODE) { 28 $node->parentNode->removeChild($textnode); 29 } else { 30 $textnode = $dom->createTextNode(''); 31 } 32 33 $figure = $dom->createElement('figure'); 34 $node->parentNode->replaceChild($figure, $node); 35 $figure->appendChild($node); 36 37 $figcaption = $dom->createElement('figcaption', trim($textnode->nodeValue) ?: 'タイトル無し'); 38 $figure->appendChild($figcaption); 39 40} 41 42$result = $dom->saveXML($dom->documentElement); 43echo $result; 44 45// もし最初に親要素を付加したならば,後からそれを除外してください 46// $result = substr($dom->saveXML($dom->documentElement), 6, -7);
投稿2016/08/23 08:26
編集2016/08/24 09:36総合スコア5223
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/23 08:27
2016/08/23 08:48
2016/08/23 09:03
2016/08/24 02:57
2016/08/24 09:13
2016/08/24 09:15 編集
2016/08/24 09:21
2016/08/25 06:27
0
ベストアンサー
simplexml_load_string()あたりでやるほうが良い気もしますが
あえて正規表現で
PHP
1<?PHP 2$content=<<<eof 3<img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" alt="○○○" width="○○○" height="○○○" />出典:https://△△△.com 4<img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" alt='xx oo' width="○○○" height="○○○" />出典:https://△△△.com 5<img class="aa bb cc etc" src="https://hogehoeg.com/○○○.jpg" width="○○○" height="○○○" />出典:https://△△△.com 6eof; 7 8$pattern="/(<img) (.*?)>(出典.*)$/m"; 9$replacement=function($a){ 10 $str="<figure>".$a[1]; 11 $pattern="/(?:src|alt)=([\"']).*?\\1/"; 12 if(preg_match_all($pattern,$a[2],$matches)){ 13 foreach($matches[0] as $val){ 14 $str.=" ".$val; 15 } 16 } 17 $str.="/>"; 18 $str.="<figcaption>".$a[3]."</figcaption></figure>"; 19 return $str; 20}; 21$content=preg_replace_callback($pattern,$replacement,$content); 22print htmlspecialchars($content); 23?>
修正版
「出典」の前に半角スペースやタブが入っている可能性がある場合は
「\s*」=0個以上のスペース文字をヒットさせてください
PHP
1$pattern="/(<img) (.*?)>\s*(出典[^\n\r]*)/m";
元ソースだとm修飾子を使うと改行文字を拾っちゃうみたいなので
出典以降改行文字がでてくるまでに変えておきました。
投稿2016/08/23 07:50
編集2016/08/24 03:20総合スコア114837
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/24 02:52
2016/08/24 03:22
2016/08/24 05:15
0
とりあえずチャレンジしてみました。
<?php $org = '<img class="aa bb cc etc" src="https://hogehoeg.com/xxx.jpg" alt="あああ" width="xxx" height="xxx" />出典:https://xxx.yyy.com'; echo $org. "\n"; echo preg_replace('/(<img.*)width.*\/>(.*$)/u', '<figure>\\1/><figcaption>\\2</figcaption></figure>', $org);
投稿2016/08/23 09:20
編集2016/08/23 09:26総合スコア910
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。