2017-05-27 62 views
0

我试图使用PHP查找文本块$content中的所有IMG标签,并将其替换为液体模板标签,同时保留其在文本中的位置以及src和和alt每个文本。在文本块中查找和转换图像标签

$content

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

<img src="http://example.com/frog.jpg" alt="frog desc" /> 

Nunc feugiat lorem tellus, et sollicitudin eros feugiat vitae. Aliquam auctor velit nec auctor semper 

<img src="http://example.com/snake.jpg" alt="snake desc" /> 

Donec egestas felis id turpis sollicitudin blandit vitae quis libero. Ut massa arcu, condimentum vitae laoreet auctor, blandit sit amet enim. 

<img src="http://example.com/toad.jpg" alt="toad desc" /> 

<img src="http://example.com/lizard.jpg" alt="lizard desc" /> 

Maecenas vel purus nec mauris dignissim pellentesque. 

变换的文本:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

{% img="frog.jpg" alt="frog desc" %} 

Nunc feugiat lorem tellus, et sollicitudin eros feugiat vitae. Aliquam auctor velit nec auctor semper 

{% img="snake.jpg" alt="snake desc" %} 

Donec egestas felis id turpis sollicitudin blandit vitae quis libero. Ut massa arcu, condimentum vitae laoreet auctor, blandit sit amet enim. 

{% img="toad.jpg" alt="toad desc" %} 

{% img="lizard.jpg" alt="lizard desc" %} 

到目前为止,我去了使用提取的所有图像及其属性到一个数组中的一个路径:How to extract img src, title and alt from html using php?但发现很难将图像重新插入文本的原始位置。

任何意见,将不胜感激:)

PS - 这里是图像串我试图影响:

<img src="http://localhost/wp/wp-content/uploads/2017/05/IMG_0061-300x225.jpg" alt="garden image" width="300" height="225" class="alignnone size-medium wp-image-386916" /> 

回答

1

试试这个,希望这会有所帮助。

Regex demo

正则表达式:<img.*?src=".*\/(?!>)([^"]+)"\s+alt="([^"]+)"[^>]+>

<img.*?src="这将匹配<img,那么所有直到src="

2..*\/(?!>)这将匹配所有,直到/有下一个字符不是>

([^"]+)这将匹配所有,直到除了"()将在第一组捕获此。

4."\s+alt="这将匹配"然后一些spaces然后alt="

5.([^"]+)"这将匹配所有除"然后匹配"然后()将在第二组捕获此。

6。[^>]+>这将匹配除了>再搭配这个>

更换:{% img="$1" alt="$2" %}

Try this code snippet here

<?php 

$string=<<<HTML 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

<img src="http://example.com/frog.jpg" alt="frog" /> 

Nunc feugiat lorem tellus, et sollicitudin eros feugiat vitae. Aliquam auctor velit nec auctor semper 

<img src="http://example.com/snake.jpg" alt="snake" /> 

Donec egestas felis id turpis sollicitudin blandit vitae quis libero. Ut massa arcu, condimentum vitae laoreet auctor, blandit sit amet enim. 

<img src="http://example.com/toad.jpg" alt="toad" /> 

<img src="http://example.com/lizard.jpg" alt="lizard" /> 

Maecenas vel purus nec mauris dignissim pellentesque. 
HTML; 
echo preg_replace('/<img.*?src=".*\/(?!>)([^"]+)"\s+alt="([^"]+)"[^>]+>/', '{% img="$1" alt="$2" %}', $string); 
+0

谢谢萨赫勒 - 我会试试这个 – jeremyzilar

+0

那你发布的第一个DEMO是完美的 - 非常感谢您的帮助! – jeremyzilar

0

虽然萨赫勒的格局不会返回预期的效果,这是不是有效率它可以/应该是。它造成了太多的捕获组,并且比我的模式多60%的步骤。

使用这个模式来代替:/<img src="[^"]*\/([^"]+" alt="[^"]+") \/>/Pattern Demo

实施(PHP Demo):

$content=' 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

<img src="http://example.com/frog.jpg" alt="frog" /> 

Nunc feugiat lorem tellus, et sollicitudin eros feugiat vitae. Aliquam auctor velit nec auctor semper 

<img src="http://example.com/snake.jpg" alt="snake" /> 

Donec egestas felis id turpis sollicitudin blandit vitae quis libero. Ut massa arcu, condimentum vitae laoreet auctor, blandit sit amet enim. 

<img src="http://example.com/toad.jpg" alt="toad" /> 

<img src="http://example.com/lizard.jpg" alt="lizard" /> 

Maecenas vel purus nec mauris dignissim pellentesque.'; 
echo preg_replace('/<img src="[^"]*\/([^"]+" alt="[^"]+") \/>/', '{% img="$1 %}', $content); 

输出:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

{% img="frog.jpg" alt="frog" %} 

Nunc feugiat lorem tellus, et sollicitudin eros feugiat vitae. Aliquam auctor velit nec auctor semper 

{% img="snake.jpg" alt="snake" %} 

Donec egestas felis id turpis sollicitudin blandit vitae quis libero. Ut massa arcu, condimentum vitae laoreet auctor, blandit sit amet enim. 

{% img="toad.jpg" alt="toad" %} 

{% img="lizard.jpg" alt="lizard" %} 

Maecenas vel purus nec mauris dignissim pellentesque.