1

我有这样的文字: Senkatel Maximus 10.1" "White"

我想去掉引号,但将引号保持在英寸规格 10.1"

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

这个: Senkatel Maximus 10.1" "White"

应该变成: Senkatel Maximus 10.1" White

我需要它作为一个通用的解决方案来剥离引号而不杀死文本中的英寸,所以如果可能的话,像Senkatel Maximus 10.1" "Moonlight blue"并且"Senkatel Maximus 10.1""应该也可以工作。

4

4 回答 4

2

看起来这项工作可以完成

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

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

于 2013-09-09T10:35:05.980 回答
2

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

$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"- 此时需要一组更复杂的代码。这可能是大多数功能的最简单代码。

于 2013-09-09T10:41:46.187 回答
2

这将删除不是直接在数字之后的任何 qoute

preg_replace('/([^0-9])"/', '$1', $string);

但如果文本是这样的:Senkatel Maximus 10.1" "White 1000" 它会变成:Senkatel Maximus 10.1" White 1000"

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

于 2013-09-09T10:41:59.277 回答
1

我想你可以试试这个:

"(\S(?:\s(?:\d+(?:\.\d+)?)"|[^"])+\S)"

并替换为$1.

我在一些散落的样品上对其进行了测试。正则表达式 101 演示

编辑:

如果您还必须从字符串中删除引号Dims: A" x B"(即,必须保留后跟双引号的数字,除非在类似的情况下"Film: 300",那么您可以使用类似于 SmokeyPHP 的正则表达式并添加我在上面制作的部分来给出这个:

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

一些样品在这里进行了测试。(请注意,\n在演示中添加了这些,因为正则表达式正在多个字符串上进行测试,并且可以在逐个字符串的基础上进行测试时将其删除)。

于 2013-09-09T13:05:04.707 回答