Регулярное выражение для замены ссылки в случае отсутствия определенного класса - PullRequest
0 голосов
/ 22 декабря 2011

Я очень старался найти решение, но не смог.Да, регулярное выражение слишком сложно.В любом случае, здесь есть проблема.

Цель: Я хочу заменить ссылку на изображение ссылками на изображение cdn в PHP.Чтобы сделать это, я подумал, что лучше использовать preg_replace.

, если links is /var/b.png ИЛИ http://www.example.com/png, он будет заменен на CDN, но если case src или class содержит captcha«тогда это не должно быть, поскольку они являются динамическими по своей природе.

Для начала я пытаюсь:

$_SERVER["HTTP_HOST"] = 'www.bring.com';
$preg_host = preg_quote($_SERVER["HTTP_HOST"], '/');
$content = preg_replace('/((\<image\s+.*?src\=)(["\']http\:\/\/'.$preg_host.')(\/.*?["\'](^(?=.*(captcha)))(.*)?\>))/i', '$2$3.nyud.net:8080$4', $content);
$content = preg_replace('/(\<image\s+.*?src\=["\'])(\/.*?["\'].*?\>)/i', '$1http://'.$_SERVER['HTTP_HOST'].'.nyud.net:8080$2', $content);

Условие таково: Когда этого не делать: src может содержать слово «captcha», а в некоторых случаях класс содержит «captcha», и этот класс может быть впереди или src или позади src, что делает его более сложным.В этих случаях я не хочу заменять ссылки, например:

$content = <<<END
<image
type="image" src="/skins/bph/customer/images/icons/go.gif" alt="Search" title="Search" class="go-button" />
<image
id="verification_image_login_login_popup_form" src="http://www.bring.com/index.php?dispatch=image.captcha&amp;verification_id=%3Alogin_login_popup_form&amp;login_login_popup_form4ef33269bf30b=" alt="" onclick="this.src += 'reload' ;"  width="100" height="25" class="image-captcha valign"  /></p><div
class="clear">
<image
id="verification_image_login_login_popup_form" class="valign" src="http://www.bring.com/skins/bph/customer/images/icons/go.gif" alt="" onclick="this.src += 'reload' ;"  width="100" height="25" /></p><div
class="clear">

END;

В результате:

Не следует заменять, но происходит наоборот: (

Следующее должно получить замену, так как в нем нет класса с капчей или ссылки со словом капчи

<image
id="verification_image_login_login_popup_form" class="valign" src="http://www.bring.com/skins/bph/customer/images/icons/xxx" alt="" onclick="this.src += 'reload' ;"  width="100" height="25" /></p>

1 Ответ

1 голос
/ 22 декабря 2011

Вместо того, чтобы пытаться решить всю проблему с помощью магии регулярных выражений (которая может укусить вас в неожиданное время), настоятельно рекомендуется использовать PHP DOM parser .

Используя DOM-парсер, переберите все изображения, изучите их атрибуты src и class и внесите необходимые изменения в ссылку.

Вы можете увидеть множество примеров использования DOM, если будете искать его здесь в SO или в Google.

...