2017-01-22 3 views
0

Чтобы избежать инъекций 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; 

ответ

2

Я хотел бы использовать метод preg_replace с \*(.*?)\* в качестве шаблона:

$text = "This is a *word* and here are *more*. That is the case *with this too*."; 

$output = preg_replace("/\*(.*?)\*/", "<b>$1</b>", $text); 
echo $output; 

Возвраты:

This is a <b>word</b> and here are <b>more</b>. That is the case <b>with this too</b>. 

Посмотрите здесь, если вы хотите играть с регулярным выражением или добавить больше примеров. https://regex101.com/r/aH6xr8/2

+0

Для курсива Я использовал бы _ _ (. *?) _ 'Как шаблон https://regex101.com/r/aH6xr8/3 –

+0

Вот ответ! Это именно то, что я имел в виду. Чтобы глубоко понять это, не могли бы вы сказать мне словами, что означает '(. *?)'? Причина для моего (очень скромного) знания регулярных выражений это означало бы '. *': Равно [^ \ n], '?': 0 или 1, и таким образом я действительно не понимал, что '(. *?) 'делает. Спасибо Спенсер! – Brigo

+0

Добро пожаловать! Все, что внутри '()' является группой захвата. '.' - любой символ, '*' количественно определяет любой символ как любое количество раз, '?' делает его не «жадным» (делает группу захвата как можно меньшей.) –

Смежные вопросы