2016-03-28 7 views
3

Ich muss alles in einer Zeichenfolge ersetzen, die kein Wort, Leerzeichen, Komma, Punkt, Fragezeichen, Ausrufezeichen, Stern oder ' ist. Ich versuche es mit preg_replace zu tun, aber nicht die richtigen Ergebnisse zu erzielen:Verwenden von preg_replace funktioniert nicht richtig

$string = "i don't know if i can do this,.?!*[email protected]#$%^&()_+123|"; 
preg_replace("~(?![\w\s]+|[\,\.\?\!\*]+|'|)~", "", $string); 

echo $string; 

. Ergebnis:?

ich weiß nicht, ob ich das tun kann, !! * @ # $%^&() _ + 123 |

Benötigen Ergebnis:

ich weiß nicht, ob ich das tun kann, *

Antwort

1

Ich weiß nicht, ob du glücklich bist html_entity_decode zu nennen zuerst, dass ' zu konvertieren.?! in einen Apostroph. Wenn Sie sind, dann ist wahrscheinlich der einfachste Weg, dies zu erreichen, ist

// Convert HTML entities to characters 
$string = html_entity_decode($string, ENT_QUOTES); 
// Remove characters other than the specified list. 
$string = preg_replace("~[^\w\s,.?!*']+~", "", $string); 
// Convert characters back to HTML entities. This will convert the ' back to ' 
$string = htmlspecialchars($string, ENT_QUOTES); 

Wenn nicht, dann werden Sie einige negative assertions verwenden müssen & zu entfernen, wenn sie nicht von # gefolgt, ;, wenn sie nicht von &#039 voraus, und bald.

$string = preg_replace("~[^\w\s,.?!*'&#;]+|&(?!#)|&#(?!039;)|(?<!&)#|(?<!&#039);~", "", $string); 

Die Ergebnisse sind subtil unterschiedlich. Wenn der erste Codeblock &quot; bereitgestellt wird, wird er in " konvertiert und dann aus der Zeichenfolge entfernt. Der zweite Block wird & und ; entfernen und quot im Ergebnis zurücklassen.

+0

Die erste Option ist besser und sauberer. – frosty