Заменить данные после расширения .PNG в регулярном выражении тега изображения - PullRequest
0 голосов
/ 26 декабря 2018

Вот мой код

<img src="folder/img1.jpg?somestring">
<img src="folder/img2.jpg?somediffstring">

хочу заменить somestring & somediffstring другой строкой во всем html.пожалуйста, предложите какое-нибудь регулярное выражение с php.

пример изменения на использование регулярного выражения или чего-либо еще

Ответы [ 4 ]

0 голосов
/ 26 декабря 2018

Прежде всего, вы не должны анализировать HTML с регулярными выражениями .


Решение 1

Теперь, если вы выполняете исключительно синтаксический анализ imgтеги, вы могли бы найти достаточно удовлетворительное решение, как это:

(\b\.jpg|\b\.png)\?(.*?)\"

То есть:

(\b\.jpg|\b\.png)  # 1st Capturing Group
    \b\.jpg        # 1st Alternative: match ``.jpg`` literally
    \b\.png        # 2nd Alternative: match ``.png`` literally
\?                 # Match the character ? literally
(.+?)              # 2nd Capturing Group
    .+?            # Match any character between one and unlimited times,
                   # as few times as possible, expanding as needed.
\"                 # Match the character " literally

Проблема

В чем проблема?Мы не проверяем, находимся ли мы внутри тега img.Это будет соответствовать везде в HTML.


Решение 2

Давайте добавим проверку для img > src:

<img.+?src=\".*?(\b\.jpg|\b\.png)\?(.+?)\"

То есть:

<img       # Match ``<img`` literally
.+?        # Match any character between one and unlimited times,
           # as few times as possible, expanding as needed.
           # Needed in case there are rel or alt options inside the img tag.
src=\"     # Match ``src="`` literally
...        # The rest is same as before.

Проблема

Это действительно делает свою работу?Очевидно, да, но на самом деле нет.

Рассмотрим следующий HTML-код

<img src="data:image/png;base64,iVBORw0KG" />
<div style="background-image: url(../images/test-background.jpg?)">
     blah blah
</div>

Это не должно совпадать, верно?Но это так (если вы удалите разрывы строк).Приведенное выше регулярное выражение начинает совпадение с <img src=" и останавливается на "> тега div.Группа захвата будет содержать символы от ? до ": ), ее замена нарушит HTML.

Это был только пример, но многие другие ситуации будут совпадать, даже если они не должны.


Другие решения ...?

Независимо от того, сколько ограничений вы можете добавить в свой RegEx и насколько он сложен ... HTML является контекстно-свободнымЯзык , и он не может быть захвачен регулярным выражением, которое распознает только Обычные языки .


В PHP

Все еще уверен, что выбудете использовать регулярные выражения?Хорошо, тогда ваша PHP функция preg_replace.Вам нужно только помнить, что он заменит все, что соответствует , а не только группы захвата.Следовательно, вам нужно обернуть то, что вы хотите «запомнить» , в другую группу захвата:

$str = '<img src="folder/img1.jpg?foo">';
$pattern = '/(<img.+?src=\".*?(\b\.jpg|\b\.png)\?)(.+?)(\")/';
$replacement = '$1' . 'bar' . '$4';

$str_replaced = preg_replace($pattern, $replacement, $str);

// Now you have $str_replaced = '<img src="folder/img1.jpg?bar">';
0 голосов
/ 26 декабря 2018

Вы можете сделать это следующим образом:

<?php

$url_value = "folder/img2.jpg?somediffstring";

echo $url =substr($url_value, 0, strpos($url_value, "?"));




?>

0 голосов
/ 26 декабря 2018

вы можете использовать регулярное выражение \? (\ W *) "

, если вы хотите заменить somestring и somediffstring на xx, тогда вы можете заменить его на регулярное выражение \? (\ W *)" и значение как? xx

https://regex101.com/r/S5pPuW/1

0 голосов
/ 26 декабря 2018

Применительно к этому Как я могу использовать захваченную группу в том же регулярном выражении

предположим, что вы хотите изменить img1.jpg?somestring на img1.jpg?somestringAAA и img2.jpg?somediffstring на img2.jpg?somediffstringAAA

Поиск: src="([a-zA-Z.0-9_]*)[?]([a-zA-Z.0-9_]*)">

Заменить на: src="$1?$2AAA">

здесь $ 1 представляет все, что находится внутри первого раунда paranthesis (), то есть img1.jpg, а $ 2 представляет второепарантез

ОБНОВЛЕНИЕ:

$string = 'img1.jpg?somestring';
$pattern = '/([a-zA-Z.0-9_]*)[?]([a-zA-Z.0-9_]*)/i';
$replacement = '$1?$2AAA';
echo preg_replace($pattern, $replacement, $string);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...