1

当使用这个简单的纺织标记时,纺织类似乎给出了编译错误。它似乎发生在链接上:

"linktext":http://www.nu.nl
["linktext":http://www.nu.nl]

编译错误:

Warning: preg_match() [function.preg-match]: Compilation failed: unrecognized character after (?< at offset 5 in /var/www/vhosts/sturb.nl/subdomains/bu/httpdocs/lib/textile.php on line 1355

所有其他标记都正常显示。

顺便说一句:我正在使用netcarver 的纺织 php 类。

编辑:这是触发错误的函数。第 1355 行是$ok = preg_match( $r, $uri, $m );

function parseURI( $uri, &$m )
{
    $r = "@^((?<scheme>[^:/?#]+):)?(//(?<authority>[^/?#]*))?(?<path>[^?#]*)(\?(?<query>[^#]*))?(#(?<fragment>.*))?@";
    #       12                     3  4                      5              6  7                8 9
    #
    #   scheme    = $2
    #   authority = $4
    #   path      = $5
    #   query     = $7
    #   fragment  = $9

    $ok = preg_match( $r, $uri, $m );
    return $ok;
}
4

1 回答 1

0

正则表达式中的“#”符号可能存在​​问题(不在字符类中的符号)。他们必须正常逃脱。

更新

显然,在 php 中,除非指定了 //x 修饰符,否则 # 被视为文字。如果用作文字,则必须对其进行转义。

您收到的错误意味着正在使用的 PHP 版本不支持“命名捕获缓冲区”。我不确定哪个版本的 php 实现了这一点。

我查看了您命名的文本文件 php 类,确实存在该函数。我不知道他们是否为您提供 php,或者您正在使用自己的。我不是php专家。

ideone.com 上用来运行我的测试用例的 PHP 版本是5.2.11,它支持命名的捕获缓冲区。

一种判断方法是您可以将命名构造从 转换(?<name> -- )( -- )。那应该运行,或者至少让你通过那个子表达式。

这是一个带有/不带有命名捕获缓冲区的测试用例http://ideone.com/dm4Q8
尝试找出正在使用的版本,也许它有一个内置的“version()”函数。

这是一个扩展/收缩的正则表达式进行测试。

'~
^(
   ([^:/?#]+)
   :
 )?
 (
   //
   ([^/?#]*)
 )?
 ([^?#]*)
 (
   \?
   ([^#]*)
 )?
 (
   \#
   (.*)
 )?
 ~x';

'~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~'
于 2012-04-16T18:03:03.867 回答