Php 如何删除字符串中破折号之前的单个字符?

Php 如何删除字符串中破折号之前的单个字符?,php,regex,Php,Regex,我有一些这种风格的字符串: $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>{an

我有一些这种风格的字符串:

$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}

编辑:

应该注意的是,我在现实中使用了波斯语字符。这里还有一个例子:

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

现场PHP演示


正则表达式解释

^.\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»

现场PHP演示


正则表达式解释

^.\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»

首先,您需要将
/w
更改为
\w
。其次,对于匹配单个字符,您可以使用字符类(如果您只想匹配字母字符),对于匹配字符串的其余部分,您可以使用修饰符
,后跟
*

preg_replace("/^[a-z]\s+-\s+.*/","",$str);
还请注意,由于您使用了锚定
^
来指定字符串的开头,因此如果您处理的是多行字符串,则需要使用标志
m
g
进行全局匹配

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

Reed关于regex的更多信息

如果您处理的是unicode字符串,那么可以使用flag
u
,这使您的正则表达式引擎能够匹配unicode字符

还请注意,您需要更改字符的范围或使用仅匹配一个字符(但不匹配所有字符)的点

或:


演示

首先,您需要将
/w
更改为
\w
。其次,对于匹配单个字符,您可以使用字符类(如果您只想匹配字母字符),对于匹配字符串的其余部分,您可以使用修饰符
,然后是
*

preg_replace("/^[a-z]\s+-\s+.*/","",$str);
还请注意,由于您使用了锚定
^
来指定字符串的开头,因此如果您处理的是多行字符串,则需要使用标志
m
g
进行全局匹配

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

Reed关于regex的更多信息

如果您处理的是unicode字符串,那么可以使用flag
u
,这使您的正则表达式引擎能够匹配unicode字符

还请注意,您需要更改字符的范围或使用仅匹配一个字符(但不匹配所有字符)的点

或:

演示

您可以使用:

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

echo preg_replace('/^\p{L}\h+-\h+/u', '', $var);
//=> این یک متن تست است
使用的正则表达式是:

^\p{L}  # match unicode letter at start
\h+     # match 1 or more horizontal space
-       # match 1 hyphen
\h+     # match 1 or more horizontal space
重要的是在此正则表达式中对unicode支持使用
/u
修饰符。

您可以使用以下方法:

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

echo preg_replace('/^\p{L}\h+-\h+/u', '', $var);
//=> این یک متن تست است
使用的正则表达式是:

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


重要的是在这个正则表达式中对unicode支持使用了
/u
修饰符。

有一个无关的
/
正斜杠,它应该是单词char占位符的
\w
。@mario I edited,tnx有一个无关的
//code>正斜杠,字符占位符的位置应该是
\w
。@mario我编辑过,tnx你能告诉我dot是什么意思吗<代码>^。
?这意味着任何一个字符?任何一个不是断线字符的字符都是非常欢迎的“堆栈:”:如果我的答案对你有帮助,请点击点击复选标记来接受它作为正确答案。✔ 在投票箭头的中间,TKS!您的解决方案很好,但老实说,我忘了提到这一点:我的字符串包含波斯语字符(不是英语)。所以你的代码对我没用,是的,我知道,这是我的错…听着,真的很感谢你的回答,我给了你+1。但是你知道你的代码对我没有用,因为我没有提到这点(波斯语字符),这真的是我的错。对不起,你能告诉我圆点是什么意思吗<代码>^。?这意味着任何一个字符?任何一个不是断线字符的字符都是非常欢迎的“堆栈:”:如果我的答案对你有帮助,请点击点击复选标记来接受它作为正确答案。✔ 在投票箭头的中间,TKS!您的解决方案很好,但老实说,我忘了提到这一点:我的字符串包含波斯语字符(不是英语)。所以你的代码对我没用,是的,我知道,这是我的错…听着,真的很感谢你的回答,我给了你+1。但是你知道你的代码对我没有用,因为我没有提到这点(波斯语字符),这真的是我的错。sorry@stack查看编辑,注意如果你想得到正确的答案,最好在问题中添加一个简单的例子来完整解释你的问题。
警告:preg_replace()[function.preg replace]:{address}
@PedroLobito中的未知修饰符“g”在regex中使用unicode可能有很多情况,我的意思是OP应该增加处理unicode的真正问题@堆栈标记
g
preg\u replace()
是隐式的,您无需提及它。检查编辑。看,非常感谢你的回答,我给了你+1。但是你知道你的代码对我没有用,因为我没有提到这点(波斯语字符),这真的是我的错。sorry@stack查看编辑,注意如果你想得到正确的答案,最好在问题中添加一个简单的例子来完整解释你的问题。
警告:preg_replace()[function.preg replace]:{address}
@PedroLobito中的未知修饰符“g”在regex中使用unicode可能有很多情况,我的意思是OP应该增加处理unicode的真正问题@堆栈标记
g
preg\u replace()
是隐式的,您无需提及它。检查编辑。看,非常感谢你的回答,我给了你+1。但是你知道你的代码对我没有用,因为我没有提到这点(波斯语字符),这真的是我的错。Sorry简单的
将与
\p{L}
一样,不是吗?是的,但仍然
/u
是必需的,
也可以匹配空格,而不仅仅是任何字母。简单的
将与
\p{L}
一样,不是吗?是的,但仍然
/u
是必需的,而且