Возьмите текст внутри <a>, но он соответствует href (preg_match_all) - PullRequest
0 голосов
/ 01 августа 2020

У меня большая строка с множеством URL-адресов, мне нужно изменить URL-адреса, которые соответствуют:

<a href="../plugins/re_records/somefile.php?page=something&id=X">important_name</a>

(где X - любое целое число, а important_name - любая строка) на:

<a href="/map/important_name">important_name</a>

Я использую preg_match_all для сопоставления всех URL-адресов:

preg_match_all('/\/plugins\/re\_records\/somefile\.php\?page\=something\&id\=*(\d+)/', $bigString, $matches, PREG_OFFSET_CAPTURE);

Проблема в том, что сейчас я не понимаю, как мне получить important_name внутри <a ..></a> после сопоставления URL-адресов .

Рекомендуется использовать preg_match_all?

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Не используйте регулярное выражение. Используйте DOMDocument. Они специально созданы для синтаксического анализа документов HTML / XML.

Получить все элементы тега привязки, проверить значение в атрибуте href и соответствующим образом изменить атрибут, используя метод setAttribute().

Фрагмент:

<?php

libxml_use_internal_errors(true); // to disable warnings if HTML is not well formed 
$o = new DOMDocument();
$o->loadHTML('<a href="../plugins/re_records/somefile.php?page=something&id=45">important_name</a>');

foreach($o->getElementsByTagName('a') as $anchor_tag){
    $href = $anchor_tag->getAttribute('href');
    if(strpos($href,'/plugins/re_records/somefile.php?page=something&id=') !== false){
        $anchor_tag->setAttribute('href','/map/'.$anchor_tag->nodeValue);
    }
}

echo $o->saveHTML();

Демо: https://3v4l.org/5GPXA

1 голос
/ 01 августа 2020

Если я вас правильно понимаю, вы пытаетесь получить совпавший important_name?

Затем просто добавьте вокруг него круглые скобки, и вы сможете получить его в $matches.

<?php
$s = '<a href="../plugins/re_records/somefile.php?page=something&id=123">important_name</a>';

preg_match_all('/\<a href\=\"\.\.\/plugins\/re\_records\/somefile\.php\?page\=something\&id\=*(\d+)\"\>(.*?)\<\/a\>/', $s, $matches, PREG_OFFSET_CAPTURE);

var_dump($matches[2][0][0])
?>

...