【问题标题】:Find substring that is closest to position needed查找最接近所需位置的子字符串
【发布时间】:2014-02-28 13:13:04
【问题描述】:

我有需要出​​现的大字符串。我需要找到最接近此事件的子字符串。

例如:

<p>one</p><p>two</p><p>three and some more</p><p>four</p><p>five</p>

我正在寻找“三”,我知道它的位置,并且我只需要获得 &lt;p&gt; 块与此事件。

<p>three and some more</p>

我可以在不使用正则表达式的情况下找到最近的&lt;p&gt; 位置吗?

【问题讨论】:

  • 只是好奇,为什么你需要完全在 PHP 中这样做,因为这看起来像是 HTML 操作的东西?
  • @NorthBridge 搜索结果输出示例

标签: php string substring


【解决方案1】:

使用带有起始索引的 strpos 在之后搜索,使用 strrpos 在之前搜索。

编辑:strrpos查找最后一次出现,所以需要先剪掉字符串。

$s = "<p>one</p><p>two</p><p>three and some more</p><p>four</p><p>five</p>";
$position = strpos($s, "three");
$end_p = strpos($s, "</p>", $position);
$previous_p = strrpos(substr($s, 0, $position), "<p>");

var_dump(substr($s, $previous_p, $end_p - $previous_p + 4));

【讨论】:

  • var_dump(substr($s, $next_p, $previous_p)); 输出'&lt;p&gt;four&lt;/p&gt;&lt;p&gt;five&lt;/'
  • 是的,但是 substr 的第二个参数是长度,而不是结束位置...添加 +3 以打印结束

    。虽然这是基本的字符串处理,但真正重要的是要知道 strrpos 找到最后一个... var_dump(substr($s, $previous_p, $next_p - $previous_p + 3)));

  • 我只需要&lt;p&gt;three and some more&lt;/p&gt;
  • 是的,这似乎是我需要的。但是我会把“+4”换成“+strlen()”
【解决方案2】:

我认为您可以explode() 将您的字符串作为数组并从数组中获取已知的子字符串位置

$string = '<p>one</p><p>two</p><p>three and some more</p><p>four</p><p>five</p>';
$str_array = explode("</p>",$string);
$sub_str = $str_array[2].'</p>';
echo $sub_str;
//output <p>three and some more</p>

Live sample

如果我改为你需要找到单词three的出现

$string = '<p>one</p><p>two</p><p>three and some more</p><p>four</p><p>five</p>';
$str_array = explode("</p>",$string);
foreach($str_array as $value)
{
    if(strpos($value,'three'))
    {
        $sub_str = $value.'</p>';
    }
}

echo $sub_str;
//output <p>three and some more</p>

Live sample

【讨论】:

  • 但是您知道您需要“2”索引。我在源字符串中只有“三个”位置。
  • 这是 2,因为数组计数从 0 开始,所以第 3 个位置实际上等于 2
  • 另一方面,我可能误解了您的问题,您是在寻找字母中的第三个吗?
  • 对不起。这很难(英语不是我的语言)但我试图解释。你告诉我我需要 foreach str_array 来查找所需的索引。
  • 是的,我说过了。我不想检查数组。但是非常感谢您的解决方案
猜你喜欢
  • 2017-07-13
  • 2012-05-21
  • 2011-05-01
  • 1970-01-01
  • 2011-05-26
  • 2020-08-20
  • 2017-11-20
  • 1970-01-01
  • 2017-06-28
相关资源
最近更新 更多