PHP regex href с не заданным заголовком - PullRequest
1 голос
/ 19 апреля 2011

Я пытаюсь создать функцию в PHP, которая будет искать в строке все href вхождения, и если заголовок не задан, он должен заменить его текстовым значением между > text </a> Я не знаю, как лучше это сделать, думая о чем-то вроде:

$s = preg_replace('/<  a[^>]*?href=[\'"](.*?)[\'"][^>]*?title=[\'"](.*?)[\'"][^>]*?>(.*?)<\/a>/si','<  a href="$1" title="$2">$3</a>',$s);

Как я могу проверить в регулярном выражении, чтобы увидеть, установлен ли $ 2, и если он не заменить его на $ 3, $ 3 может быть что-то вроде img src = "..." alt = "..." и в В этом случае я хотел бы получить значение alt.

Прежде всего, я хотел бы знать, можно ли это сделать на PHP и как, но любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2011

Здесь не совсем подходящая ссылка.Это не легко выполнимо с регулярными выражениями.Например, вы не можете использовать отрицательное утверждение (?!\4) с прямой обратной ссылкой для сравнения title= с атрибутом <img alt= (который добавляет уже достаточно сложный для извлечения).

По крайней мере, вам придетсяиспользуйте preg_replace_callback и обрабатывайте замену в отдельной функции.Там проще выделить атрибуты и сравнить alt = против title =.

Если вы не используете это для перезаписи вывода, то упростите задачу, не используя выражения regexpressions.С точки зрения производительности это не лучший выбор, но его легко сделать, например, с помощью phpQuery или QueryPath :

$qp = qp($html);
foreach ($qp->find("a") as $a) {
    $title = $a->attr("title");
    $alt = $a->find("img")->attr("$title");
    if (!$title) { $a->attr("title", $alt); }
}
$html = $qp->top()->writeHtml();

(То же самое можно сделать, только с более сложным кодом, используя DOMDocument...)

0 голосов
/ 19 апреля 2011

Возможно, предположим, что он не будет установлен, и ищите только title='':

$preg_replace("/<a[^>]*?href=[\'\"](.*?)[\'\"][^>]*?title=''>(.*?)<\/a>/i","<a href='$1' title='$2'>$2</a>","<a href='http://google.com' title=''>Google</a>");

Выход:

<a href='http://google.com' title='Google'>Google</a>

Удачи.

EDIT

Извините, не совсем уверен, что вы подразумеваете под:

также $ 3 может быть чем-то вроде img src = "..." alt = "...", и в этом случае я хотел бы получить значение alt.

Не является ли $3 в вашем примере текстом ссылки?

...