1

非常(!)正则表达式的新手,但是......

我从 $title 变量中输出了以下文本字符串:

A. This is a title
B. This is another title

ETC...

我追求以下内容:

<span>A.</span> This is a title
<span>B.</span> This is another title

ETC...

目前我有以下代码:

$title = $element['#title'];
if (preg_match("([A-Z][\.])", $title)) {
  return '<li' . drupal_attributes($element['#attributes']) . ">Blarg</li>\n";
} else {
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}

这用 Blarg 替换了 A. 到 Z. 的任何内容,但是我不确定如何进行?

在 Text Wrangler 应用程序中,我可以将正则表达式括在括号中并输出每个参数,如下所示:

argument 1 = \1
argument 2 = \2

ETC...

我知道我需要添加一个额外的正则表达式来获取文本字符串的其余部分。

也许正则表达式大师可以帮助和新手!

谢谢,

史蒂夫

4

3 回答 3

1

尝试

$title = 'A. This is a title';
$title = preg_replace('/^[A-Z]\./', '<span>$0</span>', $title);
echo $title;
// <span>A.</span> This is a title

m如果字符串包含换行符和其他标题,请在结束分隔符后添加修饰符。

如果正则表达式不匹配,则不会进行替换,因此不需要该if语句。

于 2013-04-19T11:41:23.637 回答
0

它是否总是只有 2 个字符(“A.”、“B.”、“C.”、...),因为这样你就可以使用子字符串而不是正则表达式。只需选择链接的前 2 个字符并将跨度包裹在子字符串周围

于 2013-04-19T11:43:23.190 回答
0

试试这个(未经测试):

$title = $element['#title'];

if (preg_match("/([A-Z]\.)(.*)/", $title, $matches)) {
  return '<li' . drupal_attributes($element['#attributes']) . "><span>{$matches[0]</span>{$matches[1]}</li>\n";
} else {
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}

此处的更改是首先添加/到字符串的开头和结尾(表示它是一个正则表达式),然后删除句点周围的[和,因为它本身只是一个文字字符,然后添加另一个与其余部分匹配的分组的字符串。我还添加了一个to以将这两个匹配项放入 to 中以供以后使用,我们在下辈子会这样做。].$matchespreg_match()

注意:您也可以这样做:

$title = preg_replace('/^([A-Z]\.)/', "<span>$1</span>", $title);

这将简单地将 AZ 后跟字符串开头的句点(用^字符表示)替换为<span>、该字符(用括号括起来)和</span>

同样,这没有经过测试,但应该给你一个先机:)

于 2013-04-19T11:43:32.947 回答