2016-03-28 5 views
3

Мне нужно заменить все в строке, которая не является словом, пробелом, запятой, периодом, вопросительным знаком, восклицательным знаком, звездочкой или '. Я пытаюсь сделать это с помощью preg_replace, но не получить правильные результаты:Использование preg_replace не работает должным образом

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

echo $string; 

Результат:.?

я не знаю, если я могу это сделать, !! * @ # $%^&() _ + 123 |

нужны Результат:

я не знаю, если я могу это сделать, *

ответ

1

Я не знаю, если вы счастливы назвать html_entity_decode первым, чтобы преобразовать его '.?! в апостроф. Если да, то, вероятно, самый простой способ для достижения этой цели является

// 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); 

Если нет, то вы должны будете использовать некоторые негативные assertions для удаления &, когда не следует #, ; когда не предшествует &#039, и скоро.

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

Результаты отличаются друг от друга. Первый блок кода, когда он предоставлен &quot;, преобразует его в ", а затем удаляет его из строки. Второй блок удалит & и ; и оставит quot позади.

+0

Первый вариант лучше, и более аккуратный. – frosty

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