PHP Preg替换 - 匹配字符串与空间 - Wordpress

时间:2015-05-26 00:50:32

标签: php regex wordpress

我试图扫描我的wordpress内容:

<p><span class="embed-youtube">some iframed video</span></p>   

然后将其更改为:

<p class="img_wrap"><span class="embed-youtube">some iframed video</span></p>  

在我的主题中的function.php文件中使用以下代码:

$classes = 'class="img_wrap"';
$youtube_match = preg_match('/(<p.*?)(.*?><span class="embed-youtube")/', $content, $youtube_array);

if(!empty($youtube_match))
 {
  $content = preg_replace('/(<p.*?)(.*?><span class=\"embed-youtube\")/', '$1 ' . $classes . '$2', $content);
 }

但由于某种原因,我没有得到我的正则表达式的匹配,也没有替换工作。我不明白为什么没有匹配,因为存在类embed-youtube的范围。

更新 - 这是完整的功能

function give_attachments_class($content){
   $classes = 'class="img_wrap"';
   $img_match = preg_match("/(<p.*?)(.*?><img)/", $content, $img_array);
   $youtube_match = preg_match('/(<p.*?)(.*?><span class="embed-youtube")/', $content, $youtube_array);

   // $doc = new DOMDocument;
   // @$doc->loadHTML($content); // load the HTML data

   // $xpath = new DOMXPath($doc);
   // $nodes = $xpath->query('//p/span[@class="embed-youtube"]');

   // foreach ($nodes as $node) {
   //    $node->parentNode->setAttribute('class', 'img_wrap');
   // }

   // $content = $doc->saveHTML();


   if(!empty($img_match))
    {
     $content = preg_replace('/(<p.*?)(.*?><img)/', '$1 ' . $classes . '$2', $content);
    }
   else if(!empty($youtube_match))
    {
     $content = preg_replace('/(<p.*?)(.*?><span class=\"embed-youtube\")/', '$1 ' . $classes . '$2', $content);
    }

   $content = preg_replace("/<img(.*?)src=('|\")(.*?).(bmp|gif|jpeg|jpg|png)(|\")(.*?)>/", '<img$1 data-original=$3.$4 $6>' , $content);

   return $content;
  }

的add_filter(&#39; the_content&#39;&#39; give_attachments_class&#39);

2 个答案:

答案 0 :(得分:4)

不要使用正则表达式,而是有效地使用DOM XPath 为您执行此操作。

$doc = new DOMDocument;
@$doc->loadHTML($html); // load the HTML data

$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//p/span[@class="embed-youtube"]');

foreach ($nodes as $node) {
   $node->parentNode->setAttribute('class', 'img_wrap');
}

echo $doc->saveHTML();

答案 1 :(得分:1)

这是我为你做的快速而肮脏的REGEX。它找到整个字符串以p标签开头,结束p标签,span也包括在内。我还写了它包括单引号或双引号,因为你从来不知道,也包括各个地方的空格。让我知道它是如何为你工作的,谢谢。

(<p )+(class=)['"]+img_wrap+['"](><span)+[ ]+(class=)+['"]embed-youtube+['"]>[A-Za-z0-9='" ]+(</span></p>)

我已经在您的代码和其他一些变体上进行了测试,它对我有用。