Чтобы избежать инъекций SQL, как и все мы, я дезинфицирую все строки, предоставленные пользователем. Теперь я хочу, чтобы дать пользователям возможность сохранить форматированный текст и, как я думал сделать это копировали метод Stack/WhatsApp:Заменить регулярные выражения регулярного выражения с различными заменами
*word*
->полужирный_word_
->курсивный
Перед загрузкой текста в БД, я проверить для этого символа и, если есть совпадение, я заменяю
*word*
-><b>word</b>
_word_
-><i>word</i>
Проблема заключается в том, что я уверен, что есть способ, с помощью регулярного выражения, чтобы сказать: если вы соответствуете этому стандарту (т.е. *word*
) заменить:
- в первый вхождение
*
с открытым тегом<b>
- второй встречаемости
*
с закрывающим тегом</b>
Код работает, не-рабочая часть является второй во второй петле foreach()
, внутри if()
. Моя последняя отчаянная попытка после многих была такой, но на самом деле она не имеет никакого значения даже для не-regex-эксперта, подобного мне. Я попытался разделить регулярное выражение на три разные части, вспомнив их в preg_replace
с $1
и $3
.
function textFormatting($text) {
$text = preg_replace('/[ \t]+/', ' ', $text); //transform any 2+ space in 1 space
$text = nl2br($text);
//$text = preg_replace('/[\n]+/', '<br>', $text);
$text = explode(' ', $text);
$regexAY =
[
'/([*]{1})([a-zA-Z0-9]+)([*]{1})/' =>
[
"pattern" => "*",
"openTag" => "<b>",
"closeTag" => "</b>"
],
'/([_]{1})([a-zA-Z0-9]+)([_]{1})/' =>
[
"pattern" => "_",
"openTag" => "<i>",
"closeTag" => "</i>"
]
];
$newText = [];
foreach ($text as $key => $word) {
foreach ($regexAY as $regex => $value) {
if (preg_match($regex, $word)) {
//$word = preg_replace($regexAY[$regex]["pattern"], $regexAY[$regex]["replacement"], $word);
$word = preg_replace('/$1/', $regexAY[$regex]["openTag"], $word);
$word = preg_replace('/$3/', $regexAY[$regex]["closeTag"], $word);
}
}
if ($word !== '') { array_push($newText, $word); }
}
return implode(' ', $newText);
}
$text = " Hi _this_ _text_ _is a test_
*for*
text _formatting_
so don't pay *attention*
d";
echo $text;
echo "\n -------- \n";
$text = textFormatting($text);
echo $text;
Для курсива Я использовал бы _ _ (. *?) _ 'Как шаблон https://regex101.com/r/aH6xr8/3 –
Вот ответ! Это именно то, что я имел в виду. Чтобы глубоко понять это, не могли бы вы сказать мне словами, что означает '(. *?)'? Причина для моего (очень скромного) знания регулярных выражений это означало бы '. *': Равно [^ \ n], '?': 0 или 1, и таким образом я действительно не понимал, что '(. *?) 'делает. Спасибо Спенсер! – Brigo
Добро пожаловать! Все, что внутри '()' является группой захвата. '.' - любой символ, '*' количественно определяет любой символ как любое количество раз, '?' делает его не «жадным» (делает группу захвата как можно меньшей.) –