正则表达式排除包含特殊字符的单词

时间:2020-02-29 18:34:06

标签: php regex preg-replace

我一直在寻找解决正则表达式难题的方法时遇到问题。

最近,我在一个项目中工作,我们需要用锚标签列表替换给定文本中的单词列表。

例如,给定一个字符串

This is a test string

我可能要用

代替“测试”一词
<a target="_blank"  href="https://website.com/string-random“>test</a>. 

结果字符串应如下所示

This is a <a target="_blank" href="https://website.com/string-random“>test</a> string

单词的替换是循环完成的

foreach ($documents as $document)
 
    foreach ($links as $link)
        replace keywords

在某些情况下最终会发生的事情是锚标记中的某些网址包含可能被替换的单词

例如,给定要替换的单词列表

[
    {
        'keyword': 'test',
        'link': 'https://website.com/string-random'
    },
    {
        'keyword': 'string',
        'link': 'https://random.com/string'
    }
]

在完成所有替换之后,我上面给出的示例字符串看起来像这样

This is a <a target="_blank" href="https://website.com/<a target="_blank"  href="https://random.com/string“>string</a>-random“>test</a> <a target="_blank" href="https://random.com/string“>string</a>

代替

This is a <a target="_blank" href="https://website.com/string-random“>test</a> <a target="_blank" href="https://random.com/string“>string</a>

当前,我正在寻找一个正则表达式,该正则表达式不能与任何用特殊字符包围的单词匹配,因为我认为这可以解决我的问题。

对于如何解决此问题,任何其他想法也很开放

3 个答案:

答案 0 :(得分:0)

这不仅仅是以前的替换:在标签属性/名称/值中出现的任何单词都是一个问题。

换句话说,您想要替换在某些字符之后的字符串,其中下一个<出现在下一个>之前(标记之间的字符串,而不是标记内的字符串)

因此,请尝试以下方法: (string-to-match)(?=[^>]*?<)

(很明显要替换字符串以匹配)

另一个块是超前的:它确保您可以读取任何字符,但>可以根据需要多次读取,然后是<< / p>

答案 1 :(得分:0)

尝试:

foreach ($wordlist as $word){
     $document = preg_replace("~(?! )($word[keyword])(?! )~i","<a href='$word[link]'>$1<")
}

答案 2 :(得分:0)

我发现一种模式对我来说很不错 schema = StructType([ StructField("timestamp", LongType(), True), StructField("Name", StringType(), True), StructField("Value", FloatType(), True)]) df = spark.read.format('csv').option("delimiter", "\t").schema(schema).load("myFile.csv") df = df.withColumn("timestamp", df["timestamp"].cast(TimestampType()))