我需要一种方法,根据标点符号或空格的存在将字符串分成几个不同的部分。
我的意思是,每个单词都应该被分成自己的数组元素,此外,位于单词开头或结尾的标点符号也应该放入它自己的数组元素中。
例如:
我需要能够将字符串Hello, Harry Potter. I'm Tom Riddle.
转换为
array(
"Hello",
", "
"Harry",
"Potter"
". ",
"I'm",
"Tom",
"Riddle",
". "
)
所以单词中的标点符号(例如单词中的撇号)不应该造成分离 **编辑:** 为了澄清所需行为,
I'm
、didn't
等应保持一个单词,但是hello!
、"okay,
等应与开头或结尾的标点符号分开。另外,我希望包括在搜索中的标点符号是:
- . (句号/周期)
- ? (问号)
- ! (感叹号)
- ,(逗号)
- ; (分号)
- :(冒号)
- - (连字符)
- ((开始括号)
- )(结束括号)
- { (开始花括号)
- } (结束花括号)
- [ (开始方括号)
- ] (结束方括号)
- ' (单引号)
- " (双引号)
- … (省略号)
preg_split('/(\s|[\.,\/])/', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
然而,这样做的问题如下:
- 单词中的标点符号被视为普通标点符号
- 包含数组元素的数组元素不包含空格。 编辑:抱歉表达不清;我的意思是我希望标点符号包含其后/前的空格。例如,如果是逗号,则应为
,
(后面有空格),但如果是开括号,则应为(
(前面有空格)。 - 当我添加所需的其余标点符号时(
preg_split("/(\s|[\.?!,;:-(){}[]'\"…\/])/",
)会出现错误。我非常确定这个错误是由于未转义的字符引起的,所以我将整个内容都运行了preg_quote
,它返回了\.\?\!,;\:\-\(\)\{\}\[\]'"…
,但仍然出现错误:Parse error: syntax error, unexpected '…' (T_STRING), expecting ',' or ')' in [...][...] on line 5
我对正则表达式的理解相当有限,但在查看了php文档之后,我可以得出上面的代码在遇到每个空格或逗号或标点符号时分离单词。(如果我理解错了,请纠正我?)并且,据我所知,在方括号中添加其余字符将使其在任何这些字符处分隔字符串(?)由于这种方法不起作用,我想我对它的工作原理有一些基本的误解,因此非常感谢能够得到解释。
^
来排除这样的实例,但我找不到方法。我是否误解了否定的工作原理? - M. Salman Khan/(\.\.\.\s|[-.?!,;:(){}\[\]\'"]\s?)/'
)是有效的,但这个新的代码在字符串开头/结尾处的标点符号无法正常工作:https://gyazo.com/f58e00605becc46d94292449abd1e34a - M. Salman Khan