Я хочу построить регулярное выражение, которое будет помечать эти конкретные символы как «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;
}
?>
Ваш код может быть так же просто, как
<?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
Я думаю, что вы хотите сделать, это разбить строку на фрагменты, которые являются пунктуацией (те, 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 демо