Drupal 8 过滤器或标记来替换文本块中的多个模式
Drupal 8 filter or token to replace multiple patterns in a block of text
我不太确定如何提出这个问题,但我想看看是否有办法制作 D8 过滤器或令牌,我可以使用它来搜索文本,并将部分替换为别的东西。
最终结果是能够添加类似:[amzn 0970810458]' 的内容,同时在正文字段中键入内容,然后在查看时,括号中的部分将被 link 替换为该 ISBN 编号的书亚马逊.
我能够制作一个能够在文本字符串中找到 ISBN 编号的测试代码:
$source_string = ("Lorem ipsum dolor sit amet, [amzn 0970810458] consectetur adipiscing elit. Mauris facilisis felis eu turpis ultrices molestie. Donec vel ornare eros. Integer pharetra hendrerit tincidunt. Nunc in magna vitae nibh tempus pulvinar. Cras lacinia nibh ac justo placerat pretium. Mauris volutpat non ligula sit amet tempus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. [amzn 097081044X] Suspendisse tincidunt tristique ante.");
preg_match_all("/\[amzn([^\]]*)\]/", $source_string, $matches);
$isbns = array_unique($matches[1]);
foreach($isbns as $isbn) {
$last_isbn = $isbn;
echo $isbn;
}
问题是,除非我可以使用 'strpos' 之类的东西来获取每个 ISBN 编号,将其粘贴到 URL 中,然后用正确的 link 替换括号中的部分,否则这是没有用的]s。然后我需要看看它是否可以在 Drupal 过滤器中全部工作。
也许我正在尝试做一些不可能的事情,所以我希望这里有人能告诉我我是否疯了。
我不认为你疯了。用 link 替换括号内的文本实际上对于您提供的内容并不困难,因为您可以使用 preg_replace
进行替换,而不是像您描述的 strpos
这样的东西:
$source_string = ("Lorem ipsum dolor sit amet, [amzn 0970810458] consectetur adipiscing elit. Mauris facilisis felis eu turpis ultrices molestie. Donec vel ornare eros. Integer pharetra hendrerit tincidunt. Nunc in magna vitae nibh tempus pulvinar. Cras lacinia nibh ac justo placerat pretium. Mauris volutpat non ligula sit amet tempus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. [amzn 097081044X] Suspendisse tincidunt tristique ante.");
$result = preg_replace("/\[amzn ([^\]]*)\]/", "<a href='https://www.amazon.com/dp/'></a>", $source_string);
echo $result;
查看一些 guides 为此实现 Drupal 8 过滤器应该不会太难。
编辑:
如果你也想定义一个标题,可以使用你的格式来完成:
鼻涕虫:[amzn 0970810458 "The Title of This Book"]
正则表达式:preg_replace('/\[amzn ([^\s]+) "(.+?)"\]/', '<a href="https://www.amazon.com/dp/"></a>', $source_string);
如上完整示例,请参阅 https://3v4l.org/U9PHS。
有很多不同的格式化方法。您描述的方式很好,只是请注意,如果书名包含双引号,则需要一些额外的代码来处理。
我不太确定如何提出这个问题,但我想看看是否有办法制作 D8 过滤器或令牌,我可以使用它来搜索文本,并将部分替换为别的东西。 最终结果是能够添加类似:[amzn 0970810458]' 的内容,同时在正文字段中键入内容,然后在查看时,括号中的部分将被 link 替换为该 ISBN 编号的书亚马逊.
我能够制作一个能够在文本字符串中找到 ISBN 编号的测试代码:
$source_string = ("Lorem ipsum dolor sit amet, [amzn 0970810458] consectetur adipiscing elit. Mauris facilisis felis eu turpis ultrices molestie. Donec vel ornare eros. Integer pharetra hendrerit tincidunt. Nunc in magna vitae nibh tempus pulvinar. Cras lacinia nibh ac justo placerat pretium. Mauris volutpat non ligula sit amet tempus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. [amzn 097081044X] Suspendisse tincidunt tristique ante.");
preg_match_all("/\[amzn([^\]]*)\]/", $source_string, $matches);
$isbns = array_unique($matches[1]);
foreach($isbns as $isbn) {
$last_isbn = $isbn;
echo $isbn;
}
问题是,除非我可以使用 'strpos' 之类的东西来获取每个 ISBN 编号,将其粘贴到 URL 中,然后用正确的 link 替换括号中的部分,否则这是没有用的]s。然后我需要看看它是否可以在 Drupal 过滤器中全部工作。 也许我正在尝试做一些不可能的事情,所以我希望这里有人能告诉我我是否疯了。
我不认为你疯了。用 link 替换括号内的文本实际上对于您提供的内容并不困难,因为您可以使用 preg_replace
进行替换,而不是像您描述的 strpos
这样的东西:
$source_string = ("Lorem ipsum dolor sit amet, [amzn 0970810458] consectetur adipiscing elit. Mauris facilisis felis eu turpis ultrices molestie. Donec vel ornare eros. Integer pharetra hendrerit tincidunt. Nunc in magna vitae nibh tempus pulvinar. Cras lacinia nibh ac justo placerat pretium. Mauris volutpat non ligula sit amet tempus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. [amzn 097081044X] Suspendisse tincidunt tristique ante.");
$result = preg_replace("/\[amzn ([^\]]*)\]/", "<a href='https://www.amazon.com/dp/'></a>", $source_string);
echo $result;
查看一些 guides 为此实现 Drupal 8 过滤器应该不会太难。
编辑: 如果你也想定义一个标题,可以使用你的格式来完成:
鼻涕虫:[amzn 0970810458 "The Title of This Book"]
正则表达式:preg_replace('/\[amzn ([^\s]+) "(.+?)"\]/', '<a href="https://www.amazon.com/dp/"></a>', $source_string);
如上完整示例,请参阅 https://3v4l.org/U9PHS。
有很多不同的格式化方法。您描述的方式很好,只是请注意,如果书名包含双引号,则需要一些额外的代码来处理。