可能重复:
PHP explode the string, but treat words in quotes as a single word.
我有带引号的带引号的字符串。任何人都可以给我正则表达式来解决这个问题。
this has a \\\'quoted sentence\\\' inside
报价也可以是单引号。我正在使用preg_match_all。
现在这个
preg_match_all('/\\\\"(?:\\\\.|[^\\\\"])*\\\\"|\S+/', $search_terms, $search_term_set);
Array
(
[0] => Array
(
[0] => this
[1] => has
[2] => a
[3] => \\\"quoted
[4] => sentence\\\"
[5] => inside
)
)
我想要这个输出
Array
(
[0] => Array
(
[0] => this
[1] => has
[2] => a
[3] => \\\"quoted sentence\\\"
[4] => inside
)
)
这不是这个问题的重复。 PHP explode the string, but treat words in quotes as a single word
更新:
我删除了mysql_real_escape_string。我现在需要什么样的正则表达式我只是使用魔术引号。
答案 0 :(得分:1)
这非常草率,但希望你至少得到一般的想法。
$string = "This has a 'quoted sentence' in it";
// get the string position of every ' " and space
$n_string = $string; //reset n_string
while ($pos = strpos("'", $n_string)) {
$single_pos_arr[] = $pos;
$n_string = substr($n_string, $pos);
}
$n_string = $string; //reset n_string
while ($pos = strpos('"', $n_string)) {
$double_pos_arr[] = $pos;
$n_string = substr($n_string, $pos);
}
$n_string = $string; //reset n_string
while ($pos = strpos(" ", $n_string)) {
$space_pos_arr[] = $pos;
$n_string = substr($n_string, $pos);
}
获得职位后,您可以编写一个简单的算法来完成工作。
答案 1 :(得分:0)
为什么输入字符串中有斜杠?
使用stripslashes
摆脱它们。
然后编写自己的标记生成器或使用此正则表达式:
preg_match_all("/(\"[^\"]+\")|([^\s]+)/", $input, $matches)
答案 2 :(得分:0)
评论太长了,即使它实际上是评论。
我不明白它是如何重复的,使用该链接中的原则并用三重黑色引号替换引号:
$text = "this has a \\\\\'quoted sentence\\\\\' inside and then \\\\\'some more\\\\\' stuff";
print $text; //check input
$pattern = "/\\\{3}'(?:[^\'])*\\\{3}'|\S+/";
preg_match_all($pattern, $text, $matches);
print_r($matches);
你得到了你需要的东西。这几乎是您发布的链接的100%副本,唯一的变化就是那个人想要更改分隔符的建议。
编辑:这是我的输出:
Array
(
[0] => Array
(
[0] => this
[1] => has
[2] => a
[3] => \\\'quoted sentence\\\'
[4] => inside
[5] => and
[6] => then
[7] => \\\'some more\\\'
[8] => stuff
)
)
Edit2:你是在3个斜杠后检查单引号还是双引号(如果你所做的只是匹配,你的输入和输出数组不匹配),或者你输入三个斜杠后的三个斜杠后改变单引号产出报价?如果您所做的只是匹配,只需更改模式中的两个单引号以转义双引号或用单引号括起模式,这样您就不必转义双引号。