【问题标题】:Replace curly braced wrapped expressions with hyperlinks in a string用字符串中的超链接替换花括号包裹的表达式
【发布时间】:2020-08-12 08:47:17
【问题描述】:

我正在努力使用一些正则表达式来替换我从 API 获得的新闻文章中的一些格式化表达式:

我有一个包含一些内容的长字符串。在内容中有括号 ({}),其中包含某个公司及其公司实体编号——我想将这些转换为超链接。

输入:

{Company X Inc.|CVR-1-81287283} was recently acquired by {Company Z Inc.|CVR-1-34251568}

期望的输出:

<a href="companies/CVR-1-81287283">Company X Inc.</a> was recently acquired by <a href="companies/CVR-1-34251568">Company Z Inc.</a>

【问题讨论】:

  • 到目前为止,您研究或尝试了什么?这不是免费的 write-my-code 服务。一旦您表现出自己的一些努力并在代码中遇到特定问题或疑问,我们就会为您提供帮助。您是否研究过字符串替换、正则表达式或其他解析技术?
  • 感谢您的回复!不,我没想到你会为我编写我的代码,但可能会指引我朝着正确的方向前进,因为我现在有点茫然。我已经研究过字符串替换,但正如您所见,必须替换的实体之间存在差异,因此我认为字符串替换不会开箱即用。此外,我已经研究过正则表达式,但我还不够熟练,无法看到我如何说我希望这个特定字符串的这一部分放在这里和放在那里。还有其他我尚未探索的可能性吗?
  • 没问题。我们只是在这里收到了很多“请帮我做作业”类型的问题,来自免费加载者。通常,最好准确地说明您需要帮助的内容,这样就不会看起来像是您放弃了所有需求并期望其他人免费为您解决所有问题。感知是一个强大的东西。无论如何,我可能会像解析器一样使用正则表达式,从字符串中提取必要的数据位,然后编写一些单独的 PHP 来使用这些元素生成它的新版本。我认为直接使用正则表达式替换可能会很棘手。
  • 我刚开始在这里写问题 - 对我的方法感到抱歉。我会考虑这样做。谢谢你的回答!
  • 不用担心。如果您对代码的细节感到困惑,那么一旦您编写了一些代码,如果您仍然有错误或其他问题,那将是一个很好的问题。附言网站上有一个有用的指南,解释了如何编写高质量和广受好评的问题:How To Ask

标签: php regex hyperlink preg-replace curly-braces


【解决方案1】:

你有一个格式

 { Company name | Company code}

您可以制作一个分成两部分的正则表达式,就像上面的格式一样,如下所示:

/\{([^\|]+)\|([^}]+)\}/
    ------   -------
  match       match
  company     company
  name        code

您可能会在{|} 之前看到\。这只是为了逃避正则表达式元字符。 我们基本上匹配所有不是| 的字符作为公司名称,所有字符直到} 匹配公司代码。

片段:

<?php

$str = '{Company X Inc.|CVR-1-81287283} was recently acquired by {Company Z Inc.|CVR-1-34251568}';

preg_match_all('/\{([^\|]+)\|([^}]+)\}/',$str,$matches);

$result = sprintf('<a href="companies/%s">%s</a>  was recently acquired by <a href="companies/%s">%s</a>',$matches[2][0],$matches[1][0],$matches[2][1],$matches[1][1]);

echo $result;

【讨论】:

    【解决方案2】:

    preg_replace() 是生成所需输出所需的全部内容。除此之外的任何事情都太辛苦了。

    代码:(Demo)

    $string = '{Company X Inc.|CVR-1-81287283} was recently acquired by {Company Z Inc.|CVR-1-34251568}';
    
    var_export(
        preg_replace('~\{([^|]+)\|([^}]+)}~', '<a href="companies/$2">$1</a>', $string)
    );
    

    输出:(如果你使用echo而不是var_export(),你不会看到最外面的单引号)

    '<a href="companies/CVR-1-81287283">Company X Inc.</a> was recently acquired by <a href="companies/CVR-1-34251568">Company Z Inc.</a>'
    

    图案:

    \{         #match a literal left curly brace
    (          #start capture group #1
      [^|]+    #match one or more non-pipe characters
    )          #end capture group #1
    \|         #match a literal pipe
    (          #start capture group #2
      [^}]+    #match one or more non-right-curly-braces
    )          #end capture group #2
    }          #match a literal right curly braces
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-03
      • 2021-02-02
      • 1970-01-01
      • 2020-01-07
      • 2016-11-30
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      相关资源
      最近更新 更多