Как закодировать весь URL-адрес из строки с помощью Preg_Replace

Я хочу закодировать все мои ссылки на base64, но шаблон регулярного выражения не работает должным образом.

Это мой код:

$html = 'ahsgdjagshjdgasjdgajgsd gjagdjhagsjhgda sgdhjagsjdgajhgdjad<a href="http://short.awsubs.co/be9Vk">Solidfiles</a> jashd sha7st7atsdgasgda sgahsfd ahgsfafd<a href=https://link.safelinkconverter.com/review.php?id=aHR0cDovL2JfdC5seS8ySDdMajh3&c=1&user=61942 rel=nofollow>Zippyshare</a>';
$text = '@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@';
echo $result = preg_replace_callback($text, function($matches) {
    return '<a href="'.base64_encode($matches[1]).'">'.$matches[2].'</a>';
    }, $html);

Я прочитал этот поток, который предлагает использовать preg_replace_callback() для кодирования значения href:

php, как сделать base64encode при выполнении preg_replace


person Jazuly    schedule 18.04.2018    source источник
comment
Важно завершить свой вопрос, указав точный желаемый результат. Кроме того, если вы пытаетесь разобрать html, мы предпочитаем DomDocument или аналогичный инструмент вместо регулярного выражения, потому что регулярное выражение часто является плохо подходящим инструментом.   -  person mickmackusa    schedule 18.04.2018
comment
Какими должны быть первая группа и вторая группа? Ваш текущий код имеет 7 групп   -  person JustCarty    schedule 18.04.2018
comment
@mickmackusa, если я использую domdocument, я знаю, что он печатает только то, что я установил в атрибуте и т. Д., Но я хочу найти всю ссылку, а затем заменить ее кодированием / декодированием base64, я не хочу удалять строку. я думаю, что лучший способ - использовать регулярное выражение. если у вас есть другой способ, дайте мне знать, чтобы я мог узнать больше об этом. Извините за мой английский.   -  person Jazuly    schedule 18.04.2018


Ответы (1)


Я собираюсь предоставить «нестабильное решение», поскольку регулярное выражение ненадежно. Я приспособился к атрибутам href в одинарных, двойных кавычках и без кавычек. Но я должен призвать вас использовать парсер html. Ваш образец ввода не очень реалистичен, чтобы пытаться написать решение DomDocument.

Нестабильный код: (Демо) (Демонстрация шаблона)

$html = 'ahsgdjagshjdgasjdgajgsd gjagdjhagsjhgda sgdhjagsjdgajhgdjad<a href="http://short.awsubs.co/be9Vk">Solidfiles</a> jashd sha7st7atsdgasgda sgahsfd ahgsfafd<a href=https://link.safelinkconverter.com/review.php?id=aHR0cDovL2JfdC5seS8ySDdMajh3&c=1&user=61942 rel=nofollow>Zippyshare</a>';

echo preg_replace_callback('~href=[\'"]?([^\s\'"]+)[\'"]?(.*?)>(.*?)</a>~', function($m) {
    var_export($m);
        return "<a href=\"" . base64_encode($m[1]) . "\"{$m[2]}>{$m[3]}</a>";
    }, $html);

Выход:

ahsgdjagshjdgasjdgajgsd gjagdjhagsjhgda sgdhjagsjdgajhgdjad<a <a href="aHR0cDovL3Nob3J0LmF3c3Vicy5jby9iZTlWaw==">Solidfiles</a> jashd sha7st7atsdgasgda sgahsfd ahgsfafd<a <a href="aHR0cHM6Ly9saW5rLnNhZmVsaW5rY29udmVydGVyLmNvbS9yZXZpZXcucGhwP2lkPWFIUjBjRG92TDJKZmRDNXNlUzh5U0RkTWFqaDMmYz0xJnVzZXI9NjE5NDI=" rel=nofollow>Zippyshare</a>
person mickmackusa    schedule 18.04.2018
comment
можно ли сделать его более конкретным, что-то добавить ссылку включить и исключить. например, кодируйте ссылку с помощью awsub.co, но не кодируйте ссылку с помощью safelinkconverter.com. - person Jazuly; 18.04.2018
comment
Если изменение шаблона становится слишком запутанным, вы можете оставить шаблон в покое и просто написать условие strpos() в строке возврата на $m[1]. Я не за своим компьютером, поэтому я не могу предложить более конкретную поддержку. - person mickmackusa; 18.04.2018
comment
Это шаблон (*SKIP)(*FAIL), который я предлагал: regex101.com/r/EFSIej/3 - person mickmackusa; 18.04.2018
comment
работает, но я пытаюсь добавить больше ссылок, чтобы исключить anotherlink.com, и изменить регулярное выражение на (?:safelinkconverter\.com|anotherlink.com)(*SKIP)(*FAIL)|, вы можете увидеть вопрос, я обновлю свой код. он пропускает safelink, но все еще кодирует anotherlink.com. - person Jazuly; 18.04.2018
comment
извините, я откатываю его - person Jazuly; 18.04.2018
comment
Как насчет этого обновления? regex101.com/r/EFSIej/4 Я ухожу на ночь. Утром проверю сообщения. - person mickmackusa; 18.04.2018
comment
работает, но почему вы отделили .com от доменного имени, как, если у него другой домен? например .net и т.д. - person Jazuly; 18.04.2018
comment
я группирую это так, и это тоже работает (?:safelinkconverter\.com|anotherlink\.com) regex101.com/r/EFSIej/6 спасибо тебе помочь @mickmackusa - person Jazuly; 18.04.2018