2015-10-14 3 views
1

У меня есть строка с этим стилем:Как удалить одиночный символ перед тире в строке?

$var = "a - it is a string";  // I want this output: 'it is a string' 
$var = "m - it is second string"; // I want this output: 'it is second string' 

Так вот моя картина:

[single character in the first of string]<space>-<space>{anything} // I want just {anything} 

Как я могу сделать это в PHP Regex?

Вот моя попытка (altought не работает, и я уверен, что это действительно далеко от того, что я хочу)

preg_replace("/^\w\s+-\s+/","",$str); 

Edit:

Следует отметить, что Я использую персидские символы на самом деле. Кроме того, здесь приведен пример:

$var = 'ی - این یک متن تست است'; 
+0

Существует посторонняя '/' прямая косая черта, где она должна быть '\ w' для слова char placeholder. – mario

+0

@mario Я отредактировал, tnx – stack

ответ

1

Вы можете использовать это:

$var = 'ی - این یک متن تست است'; 

echo preg_replace('/^\p{L}\h+-\h+/u', '', $var); 
//=> این یک متن تست است 

Regex используется:

^\p{L} # match unicode letter at start 
\h+  # match 1 or more horizontal space 
-  # match 1 hyphen 
\h+  # match 1 or more horizontal space 

Немаловажным является использование /u модификатора для поддержки юникода в этом регулярном выражении.

+0

Простой '.' будет делать то же самое, что и' \ p {L} ', не так ли? –

+0

Да, но все равно '/ u' требуется, а' .' также может соответствовать пробелу, а не только букве. – anubhava

2
preg_replace('/^.\s-\s/', '', $var); 

Живой PHP Демо

http://ideone.com/fvIKBE


Regex Объяснение

^.\s-\s 

Assert position at the beginning of a line «^» 
Match any single character that is NOT a line break character «.» 
Match a single character that is a “whitespace character” «\s» 
Match the character “-” literally «-» 
Match a single character that is a “whitespace character” «\s» 
+0

Не могли бы вы рассказать мне, что такое точка? '^ .'? Это означает любой символ? – stack

+0

Любой символ, который не является символом прерывания строки –

+0

Вы очень приветствуете @stack :) Если мой ответ вам помог, подумайте о том, чтобы принять его как правильный ответ, нажав галочку ✔ в середине стрелок для голосования, tks ! –

1

Прежде всего, вам нужно изменить /w к \w .Secondly в для согласования одного символа вы можете использовать класс символов (если вы просто хотите, чтобы соответствовать алфавитному символу) и матч остальных строк вы можете использовать модификатор . с последующим *:

preg_replace("/^[a-z]\s+-\s+.*/","",$str); 

Также отметим, что так как вы использовали якорь ^, чтобы указать начало строки, если вы имеете дело с несколькими строки линии, необходимо использовать флаг m и g для матча глобальной ,

preg_replace("/^[a-z]\s+-\s+.*/m","",$str); 

См демонстрационная https://regex101.com/r/gT9wB8/1

Рид больше о регулярных выражениях https://www.regular-expressions.info

Если вы имеете дело с юникод строк, которые вы можете использовать флаг u, что делает ваш движок регулярных выражений, чтобы соответствовать символы Юникода.

также отметить, что вам необходимо изменить диапазон ваших персонажей или использовать точку ., которые соответствуют только одному символу (но все символы):

'/^.\s+-\s+.*/mu' 

Или:

'/^[\u0622-\u06cc]\s+-\s+.*/mu' 

Demo https://regex101.com/r/gT9wB8/2

+0

@stack Проверьте изменения и обратите внимание, что если вы хотите получить правильный ответ, вам лучше предоставить полное объяснение вашей проблемы, добавив минимальный пример в ваш вопрос. – Kasramvd

+0

'Предупреждение: preg_replace() [function.preg-replace]: Неизвестный модификатор 'g' в {address}' – stack

+0

OP использует персидские уставы и забыл упомянуть ... –

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