Замена текстовых запросов

211
17 ноября 2017, 09:03

Например, я получаю данные через $_POST в виде:

$text = "(ref|https://stackoverflow.com|Текст) лучший сайт в мире";

Мне нужно, чтобы произошла замена на:

<a href="https://stackoverflow.com">Текст</a> лучший сайт в мире

Пробовал разное, что-то типа str_replace и т.д., но не получается. Тк помимо этой строки я получаю еще текст. А заменять нужно именно эту строку + чтобы текст "лучший сайт в мире" оставался не тронутым. Есть решение?

Answer 1
$text = "(ref|https://stackoverflow.com|Текст) лучший сайт в мире";
$pattern = '/\((ref)\|(.*)\|(.*)\)/i';
$replacement = '<a href="$2">$3</a>';
echo preg_replace($pattern, $replacement, $text);

Выведет: <a href="https://stackoverflow.com">Текст</a> лучший сайт в мире

Answer 2

Разбирать структуру с выраженным синтаксисом нужно с помощью лексера/парсера.
Особенно если это не единичный случай.

Но всё же:

function translate($input){
  if(preg_match("_\(ref\|((?:https?|ftp)://(?:-\.)?(?:[^\s/?\.#-]+\.?)+(?:/[^\s]*)?)\|([^\)]+)\)(.+)?_iS", $input, $matches) === false) return false;
  return "<a href='" . $matches[1] . "'>" . $matches[2] . "</a>" . $matches[3];
}
$text = "(ref|https://stackoverflow.com|Текст) - лучший сайт в мире";
var_dump(translate($text)); // string(86) "<a href='https://stackoverflow.com'>Текст</a> - лучший сайт в мире"

Repl.it

READ ALSO
Защита curl запроса

Защита curl запроса

Есть curl запрос который принимает данные и записывает в бдВопрос: есть ли какая уязвимость здесь и если есть то как защититься? Я про подделывания...

214
Определить, есть ли в строке изображения

Определить, есть ли в строке изображения

ЗдравствуйтеЕсть переменная $text в которой находится текст в виде html содержимого

161
Как получить нужное изображение

Как получить нужное изображение

ЗдравствуйтеПытаюсь парсером получить нужный контент

185
Выгрузка данных из PHP в Google Spreadsheet

Выгрузка данных из PHP в Google Spreadsheet

На сайте реализована выгрузка данных в CSVВ виде входящих данных многомерный массив

244