2017-01-22 5 views
0

Um SQL-Injektionen, wie wir alle, zu vermeiden, sanitize ich alle von Benutzern bereitgestellten Zeichenfolgen. Jetzt möchte ich die Möglichkeit für die Nutzer geben, formatierten Text zu speichern und die Art, wie ich dachte, es war zu tun hat das Kopieren der Stapel/WhatsApp Methode:Replace Regex gleichen Muster Vorkommen mit verschiedenen Ersetzungen

  • *word* ->fett
  • _word_ ->kursiv

Vor den Text in die DB das Hochladen, überprüfe ich für diesen Charakter, und wenn es eine Übereinstimmung ist, ersetze ich

  • *word* -><b>word</b>
  • _word_ -><i>word</i>

Das Problem ist, dass ich bin sicher, gibt es einen Weg, einen regulären Ausdruck, zu sagen: Wenn Sie diesen Standard entsprechen (d *word*) ersetzen:

  • die erste Vorkommen * mit dem offenen Tag <b>
  • die zweiten Vorkommen * mit dem Ende-Tag </b>

Der Code funktioniert, die nicht arbeitende Teil ist das in der zweiten foreach() Schleife, innerhalb der if(). Mein letzter verzweifelter Versuch nach vielen war das, aber es hat selbst für einen Nicht-Regex-Experten wie mich keine Bedeutung. Ich habe versucht, die Regex in ihre drei verschiedenen Teile zu teilen und sie in preg_replace mit $1 und $3 zurückzurufen.

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; 

Antwort

2

Ich würde verwenden, um die preg_replace Methode mit \*(.*?)\* als Muster:

$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; 

Returns:

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

Schauen Sie hier, wenn Sie mit dem regex spielen möchten oder weitere Beispiele hinzufügen. https://regex101.com/r/aH6xr8/2

+0

Für kursiv würde ich '_ (. *?) _' Als das Muster verwenden https://regex101.com/r/aH6xr8/3 –

+0

Hier ist die Antwort! Genau das meinte ich. Kannst du mir in Worten sagen, was "(. *?)" Bedeutet? Ursache für meine (wirklich bescheidene) Kenntnis von Regexes würde das bedeuten. '': Gleich [^ \ n], '?': 0 oder 1, und auf diese Weise habe ich nicht wirklich verstanden, was '(. *?) 'tut. Danke Spencer! – Brigo

+0

Gern geschehen! Alles innerhalb von '()' ist eine Erfassungsgruppe. '.' ist ein beliebiges Zeichen,' * 'quantifiziert beliebig viele Zeichen,'? 'macht es nicht" gierig "(macht die Fanggruppe so klein wie möglich.) –