preg_split没有这个功能

时间:2018-01-26 21:24:33

标签: php

我想学习如何使用一组与preg_split函数完全相同的PHP代码,而不使用实际的preg_split函数。以此为例

<?php
$string = '<p>i am a sentence <span id="blah"> im content inside of the span </span> im another sentence <span id="anId">i m another span content</span> im the last sentence in this p tag <span id="last">im the third span tag in this p tag<span></p>';

if ( preg_match_all("/<span[^>]*>/", $string, $temporaryArray) ) {
    foreach ($temporaryArray as $values) {
        $theArrayWithoutUsingPregSplit[$strpos] = $values;
    }
}

?>

这不起作用,因为preg_match_all只计算匹配的次数而不获取实际的字符串。但是此页http://php.net/manual/en/function.preg-split.php#118326上的人能够做到这一点。有人可以帮忙吗。

另外我想让strpos()函数用作每个数组元素的键,这样我就能看到$string变量中值的位置,在我给出的例子中变量没有价值。

我试图从字符串变量中获取的结束输出是

array (
    [$thisVariableIsANumberWhichIsTheStrPosOfTheValue]  i am a sentence 
    [$thisVariableIsANumberWhichIsTheStrPosOfTheValue]  im content inside of the span 
    [$thisVariableIsANumberWhichIsTheStrPosOfTheValue]  im another sentence 
    [$thisVariableIsANumberWhichIsTheStrPosOfTheValue]  i m another span content 
    [$thisVariableIsANumberWhichIsTheStrPosOfTheValue]  im the last sentence in this p tag 
    [$thisVariableIsANumberWhichIsTheStrPosOfTheValue]  im the third span tag in this p tag 
)

我不认为preg_split是在这种情况下使用的最好的原因是因为我不能使用表示值strpos的数组键。

对于这么多的写作感到抱歉,我试着让问题变得可以理解,因为我可以做到这一点,或者人们可能会投票,如果你有任何问题可以自由提问。

3 个答案:

答案 0 :(得分:0)

使用DOMDocument:

$string = '<p>i am a sentence <span id="blah"> im content inside of the span </span> im another sentence <span id="anId">i m another span content</span> im the last sentence in this p tag <span id="last">im the third span tag in this p tag<span></p>';

$dom = new DOMDocument;
$dom->loadHTML($string, LIBXML_HTML_NOIMPLIED);
$xp = new DOMXPath($dom);

foreach($xp->query('//text()') as $textNode) {
    echo trim($textNode->nodeValue), PHP_EOL;
}

demo

这种方法包括在每个文本节点之后使用XPath查询语言询问简单查询//text()(DOM树中任何位置的文本节点)。

答案 1 :(得分:0)

要在<span></span>之间获取文字,您需要更改正则表达式以匹配它们,并在两者之间使用捕获组。

$temporaryArray是一个二维数组; element 0包含整个正则表达式的匹配项,元素N包含第N个捕获组的匹配项。所以你想要的字符串在$temporaryArray[1]。如果您还想要这些职位,请使用PREG_OFFSET_CAPTURE选项。使用此选项,每个匹配都是一个数组[ "string", strpos ]

if ( preg_match_all('#<span[^>]*>(.*?)</span>#', $string, $temporaryArray, PREG_OFFSET_CAPTURE) ) {
    $theArrayWithoutUsingPregSplit = array();
    foreach($temporaryArray[1] as $match) {
        $theArrayWithoutUsingPregSplit[$match[1]] = $match[0];
    }
}

DEMO

答案 2 :(得分:0)

我很抱歉我可能给你造成的麻烦,我想在没有preg_split()函数的情况下这样做的原因是因为我认为preg_split()无法返回它返回的字符串的strpos但是这一次它就是这样的 $Array = preg_split('/<[^>]*>/', $string, 0, PREG_SPLIT_OFFSET_CAPTURE); 得到我想要的东西。我只是想能够使用strpos以及字符串中的字符串。我喜欢这个网站有这样一个有用的社区,我感谢大家的帮助,我非常感激。