【问题标题】:php preg_split() to find text inbetween two wordsphp preg_split() 查找两个单词之间的文本
【发布时间】:2011-02-14 02:58:48
【问题描述】:

如何使用 preg_split() 来获取 [item:1] 和 [/item:1] 之间的值
$query= [item:1] my content [/item:1];

这不起作用
$match = preg_split('/[[item:1][\/item:1]]/', $query);
echo $match[0];

输出应该只是“我的内容”。

更新:

$查询 = ' [page:1]你有第一页的内容[/page:1] [page:2]你有第二页的内容[/page:2] '; // 解析函数 函数 parse_page($page, $string) { // 非常重要的删除任何会搞砸解析的东西 $string = str_replace(array("\r", "\n", "\t", "\f"), array('', ''), $string); // 用页码测试字符串 preg_match('@\[page:'.$page.'\](.*?)\[/page:'.$page.'\]@', $string, $matches); // 如果匹配成功则返回匹配 如果($匹配){ 返回$匹配; }别的 { 返回假; } } // 如果页面被设置然后尝试获取它 如果(isset($_GET['p'])){ // 将返回的解析值设置为变量 $page_dump = parse_page(($_GET['p']), $query); // 检查是否匹配成功 如果($page_dump[1]){ 回声 $page_dump[1]; }别的 { 回声“0”; } }别的 { // 如果没有指定页面,则解析第 1 页。 $page_dump = parse_page('1', $query); 如果($page_dump[1]){ 回声 $page_dump[1]; }别的 { echo '没有页面 =('; } }

【问题讨论】:

  • 为什么要使用preg_split(),preg_match_all()会是更好的选择?
  • 我更新了它以使其正常工作,但是当括号之间有大量文本转储时,它仍然存在问题,我认为这是由于隐藏字符,例如返回的 \n 和制表符的 \t

标签: php regex preg-split


【解决方案1】:

你不想拆分字符串,你想捕获一个模式。为此,请使用preg_match,例如

if (preg_match('@\[item:1\](.*?)\[/item:1\]@s', $query, $matches)) {
    echo $matches[1];
}

编辑:测试和工作

Edit2:添加了“s”(PCRE_DOTALL)修饰符 - http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

你真的应该考虑一个更好的标记解决方案(参见 XML)

【讨论】:

  • 我试过这个并且它可以工作,但是当我在括号之间抛出一个巨大的 html 转储时它失败了。
  • 是否有任何不可见字符(例如 \n 和 \t)可能会搞砸正则表达式?
  • @kr1zmo 在这种情况下,我会说你使用了错误的方法。如果所有内容都必须存储在一个大型结构中,为什么不使用 XML 来分​​隔页面。这样您就可以使用应该能够处理它的 SimpleXML 或 DOM。只需将您的 HTML 放入 <![CDATA[ ... ]]> 部分
  • @kr1zmo 尝试在模式上使用“s”修饰符(参见编辑)。这显然不是正则表达式解决的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2022-01-14
  • 2014-11-05
  • 2013-04-04
  • 1970-01-01
相关资源
最近更新 更多