регулярное выражение соответствует определенному символу ‘- & quot; () *,. :…; ? `

Я хочу построить регулярное выражение, которое будет помечать эти конкретные символы как «SYM». Поэтому я строю регулярное выражение в php, которое будет соответствовать ТОЛЬКО этому конкретному символу. Есть ли регулярное выражение, которое принимает эти символы?

'   -   "   (   )  *  ,  .   :  …  ;  ?  `

Вывод должен быть таким:
‘\ SYM
— \ SYM
«\ SYM
(\ SYM
) \ SYM & скоро…

Это моя программа, но она не работает:

<?php
$str = "'this' is Mary! (a dog - not a human)";
$split = explode(" ",$str);
foreach($split as $value) {
$match = array();
$count = preg_match_all("/\!/|\'/|\-/",$value,$match);
if ($count != 0)
$text = "\SYM";
else
$text = "\not SYM";
echo "<br>".$count." ".$value." ".$text;
}
?>

2

Решение

Ваш код может быть так же просто, как

<?php
$in = "'this' is Mary! (a dog - not a human)";
$out = preg_replace('/([-\'"()*,.:…;?`])/', '\1\\SYM ', $in);
echo $out;

регулярное выражение /([-'"()*,.:…;?])/ соответствует каждому из ваших специальных символов и захватывает его для последующего использования, но будьте осторожны: тире (-) должен быть первым в классе символов, чтобы избежать создания диапазонов, необходимо экранировать одинарные кавычки (для PHP). Замена просто заменяет захват (сначала вводится скобка слева, поэтому \1) с собой и добавляет строку \ SYM и пробельные. если вам нужно больше пробелов вокруг вашей замены, вы можете изменить строку замены на что-то вроде ' \1\\SYM ' или же ‘\1 \\SYM ' или даже ' \1 \\SYM '

Более «изощренный» (или элегантный, или занудный) метод с использованием lookarounds выглядит примерно так же:

$out = preg_replace('/(?<=[-\'"()*,.:…;?`])/', '\SYM ', $in);

главное отличие в том, что он не захватывает специальный символ, но соответствует ПОЗАДИ один. Обратите внимание, что только позиция здесь сопоставляется, эта позиция (представьте ее как пустую строку) заменяется вашей отметкой — фактически просто вставка Ваша оценка

Оба подхода дают одинаковый результат:

'\SYM this'\SYM  is Mary! (\SYM a dog -\SYM  not a human)\SYM
1

Другие решения

Я думаю, что вы хотите сделать, это разбить строку на фрагменты, которые являются пунктуацией (те, SYM те) и куски, состоящие из других символов (за исключением пробелов, те not SYM из них).

использование

$sym_rx = "~(?:([^-'\"()*,.:…;?`\s]+)|([-'\"()*,.:…;?`]))(\s)*~u";
$str = "'this' is Mary! (a dog - not a human)";
echo preg_replace_callback($sym_rx, function ($m) {
$ins = !empty($m[2]) ? $m[2] . "\\SYM" : $m[1] . "\\not SYM";
return !empty($m[3]) ? $ins . $m[3] : $ins . " ";
}, $str);
// => '\SYM this\not SYM '\SYM is\not SYM Mary!\not SYM (\SYM a\not SYM dog\not SYM -\SYM not\not SYM a\not SYM human\not SYM )\SYM

Увидеть PHP демо

1

По вопросам рекламы [email protected]