在文本块中查找和转换图像标记

时间:2017-05-27 13:33:58

标签: php regex replace

我正在尝试使用PHP查找文本块$content中的所有IMG标记,并用液体模板标记替换它们,同时保留它们在文本中的位置以及src和{{1每个文本。

示例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. 

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

任何建议都将受到赞赏:)

PS - 这是我试图影响的图像字符串:

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" %}

2 个答案:

答案 0 :(得分:1)

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

Regex demo

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

  

1。 <img.*?src="这将匹配<img,然后全部匹配src="

     

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

     

3。 ([^"]+)这将匹配除"以外的所有内容,()将在第一组中捕获此内容。

     

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);

答案 1 :(得分:0)

虽然Sahil的模式确实恢复了预期的效果,但它并不像它应该的那样有效。它使得捕获组太多,并且比我的模式多花费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.