Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 替换引号,但保持英寸_Php_Regex - Fatal编程技术网

Php 替换引号,但保持英寸

Php 替换引号,但保持英寸,php,regex,Php,Regex,我有这样的文字:Senkatel Maximus 10.1“白色” 我想去掉报价,但将报价保留在英寸规格10.1“ 我尝试使用正则表达式,但它不支持可变长度的负lookaheads 此:Senkatel Maximus 10.1“白色” 应该变成:Senkatel Maximus 10.1英寸白色 我需要它作为一个通用的解决方案,在不减少文本中的英寸数的情况下删除引号,这样像Senkatel Maximus 10.1“月光蓝”和“Senkatel Maximus 10.1”这样的东西如果可能的话

我有这样的文字:Senkatel Maximus 10.1“白色”

我想去掉报价,但将报价保留在英寸规格10.1“

我尝试使用正则表达式,但它不支持可变长度的负lookaheads

此:
Senkatel Maximus 10.1“白色”

应该变成:
Senkatel Maximus 10.1英寸白色


我需要它作为一个通用的解决方案,在不减少文本中的英寸数的情况下删除引号,这样像
Senkatel Maximus 10.1“月光蓝”
“Senkatel Maximus 10.1”
这样的东西如果可能的话也应该可以工作。

看起来这项工作可以用

preg_replace('/"(\S*?)"/', '$1', $string);

这将删除字符串中任何非空白部分的引号。假设在单引号(应保留)和任何引号对(应删除)之间至少出现一个空格字符,并且引号对不包含任何空格,则可以正常工作。

看起来可以使用

preg_replace('/"(\S*?)"/', '$1', $string);

这将删除字符串中任何非空白部分的引号。假设在单引号(应保留)和任何引号对(应删除)之间至少出现一个空格字符,并且引号对不包含任何空格,则可以正常工作。

以下内容适用于本页提到的大多数情况:

$newStr = preg_replace('#(^|[^0-9])"([^"]+)"#','$1$2',$str);
(部分)测试结果:

"test" Senkatel "woo69" 2"-5" Maximus 10.1" "White"
test Senkatel woo69 2"-5" Maximus 10.1" White

Product: "Senkatel Maximus 10.1""
Product: Senkatel Maximus 10.1"

Dims: 4" x 6"
Dims: 4" x 6"

"Film: 300"
Film: 300

如果字符串中间有几英寸,则会出现问题。


“Senkatel 10.1”Maximus”
-此时需要一组更复杂的代码。这可能是most功能最简单的代码。

以下代码适用于本页提到的大多数情况:

$newStr = preg_replace('#(^|[^0-9])"([^"]+)"#','$1$2',$str);
(部分)测试结果:

"test" Senkatel "woo69" 2"-5" Maximus 10.1" "White"
test Senkatel woo69 2"-5" Maximus 10.1" White

Product: "Senkatel Maximus 10.1""
Product: Senkatel Maximus 10.1"

Dims: 4" x 6"
Dims: 4" x 6"

"Film: 300"
Film: 300

如果字符串中间有几英寸,则会出现问题。


“Senkatel 10.1”Maximus”
-此时需要更复杂的代码集。这可能是most函数最简单的代码。

这将删除任何不在数字后面的qoute

preg_replace('/([^0-9])"/', '$1', $string);
但是如果文本是这样的:
Senkatel Maximus 10.1“白色1000”
它将变成:
Senkatel Maximus 10.1“白色1000”


很难区分带引号的数字和英寸规格

这会删除任何不在数字后面的qoute

preg_replace('/([^0-9])"/', '$1', $string);
但是如果文本是这样的:
Senkatel Maximus 10.1“白色1000”
它将变成:
Senkatel Maximus 10.1“白色1000”


很难区分带引号的数字和英寸规格

我想你可以试试这个:

"(\S(?:\s(?:\d+(?:\.\d+)?)"|[^"])+\S)"
并替换为
$1

我在附近的一些样品上做了测试

编辑:

如果您必须从字符串中删除引号,如
Dims:A“x B”
(即,除非在
“Film:300”
等情况下,否则只需保留数字后跟双引号),那么您可以使用有点像SmokeyHP的正则表达式并添加我在上面制作的一部分,以实现以下目的:

(^|[^0-9])"((\b\d+(?:\.\d+)?"|[^"])+)"

一些示例已经过测试。(请注意,
\n
是在演示中添加的,因为正则表达式是在多个字符串上进行测试的,并且可以在逐个字符串进行测试时删除)。

我认为您可以尝试此示例:

"(\S(?:\s(?:\d+(?:\.\d+)?)"|[^"])+\S)"
并替换为
$1

我在附近的一些样品上做了测试

编辑:

如果您必须从字符串中删除引号,如
Dims:A“x B”
(即,除非在
“Film:300”
等情况下,否则只需保留数字后跟双引号),那么您可以使用有点像SmokeyHP的正则表达式并添加我在上面制作的一部分,以实现以下目的:

(^|[^0-9])"((\b\d+(?:\.\d+)?"|[^"])+)"

一些示例已经过测试。(注意,
\n
是在演示中添加的,因为正则表达式是在多个字符串上测试的,在逐个字符串进行测试时可以删除).

@Itay:我只是想指出这一点。我不认为它在所有情况下都能起作用,因为你需要一些东西来表示一个引号是单引号还是一对合法引号中的一个。我选择了“中间没有空格”作为区分成对的属性。如果这是OP的问题,那么我们需要找到其他东西。例如,如果我使用了
/“(.*?(“Foo 23”
”等。除非您编写一个完整的解析器,否则它无法处理所有内容。@Jon即使是解析器也可能会遇到
XYZ Size 3“x 5”之类的问题
asmentioned@Itay:我只是想指出这一点。我不认为它在所有情况下都能起作用,因为你需要一些东西来表示引用是单引号还是合法对引号。我选择了“中间没有空格”作为区分成对的属性。如果这是OP的问题,那么我们需要找到其他东西。例如,如果我使用了
/“(.*?(“Foo 23”
”等。除非您编写一个完整的解析器,否则它无法处理所有内容。@Jon即使是解析器也可能会遇到
XYZ Size 3“x 5”之类的问题
如前所述,我看到了,为什么他们必须对英寸使用引号!!嘎!这个正则表达式适用于除引号外的所有数字(它适用于您发布的所有示例)。但实际上解析也是一个问题。想想这个:
XYZ大小3“x 5”
它的意思是3英寸乘5英寸,但是有一个开头和结尾的引号,解析它会非常困难。我知道,我没有想到
XYZ大小3“x 5”
但是你是对的。第一个引号前面的空格
XYZ大小3“x 5”
可以用作指示它是一英寸,比较:
XYZ大小3“x 5”
XYZ Size 3“x 5”
我明白了,他们为什么要用引号表示英寸!!嘎!这个正则表达式适用于除引号外的所有数字(它适用于您发布的所有示例)。但实际上解析也是一个问题。想想这个:
XYZ Size 3“x 5”
它的意思是3 I