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字符串,那么可以使用flagu
,这使您的正则表达式引擎能够匹配unicode字符
还请注意,您需要更改字符的范围或使用仅匹配一个字符(但不匹配所有字符)的点
:
或:
演示首先,您需要将
/w
更改为\w
。其次,对于匹配单个字符,您可以使用字符类(如果您只想匹配字母字符),对于匹配字符串的其余部分,您可以使用修饰符
,然后是*
:
preg_replace("/^[a-z]\s+-\s+.*/","",$str);
还请注意,由于您使用了锚定^
来指定字符串的开头,因此如果您处理的是多行字符串,则需要使用标志m
和g
进行全局匹配
preg_replace("/^[a-z]\s+-\s+.*/m","",$str);
见演示
Reed关于regex的更多信息
如果您处理的是unicode字符串,那么可以使用flagu
,这使您的正则表达式引擎能够匹配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
是必需的,而且