问题描述
|
我试图用占位符内容构建的html元素替换文本文件中的占位符。
例如,我有一个占位符,例如
{Image,picture.jpg,Centre,Picture Info}
我想将其转换为:
<img src=\"urltopicture\\picture.jpg\" alt=\"Picture Info\" class=\"quipImgCentre\"></img>
我希望使用ѭ2来标识所有占位符,然后向后进行文档转换并依次替换每个占位符。
正则表达式{。*}在一行上只有一个占位符的地方起作用,但如果不止一个占位符-在下面的文本中,它将作为一个长的占位符返回,从第一个开头的\“ {\”到最后一个\“} \”。
Aenean non felis at est gravida tincidunt. {Link,news.bbc.co.uk,popup,500,800} Donec non diam a mauris vestibulum condimentum eu vitae mi! Aenean sed elit libero,id mollis felis! {Image,ServiceTile.jpg,Left}
另外-如果有人能以更巧妙的方式执行此占位符替换,我希望听到它。
解决方法
对每个占位符重复此部分:
Regex PlaceholderExpander = new Regex(@\"\\{Image,([^,]+),]+)(?:,([^}]+))?\\}\");
string Expanded = PlaceholderExpander.Replace(YourHtmlStringWithPlaceholders,\"<img src=\'$1\' alt=\'$3\' class=\'quipImg$2\'></img>\");
[^,]
表示\“除,
\以外的任何字符”,因此尽管贪婪的+
量词也停在下一个,
之前。这是提高处理速度的技巧。一个更明显的替代方法是使用懒惰(又称不贪心,不情愿)量词。
(?:…)
是一个非捕获组-不能用$3
之类的东西对其进行反向引用。我用它包含了属于最后一个可选参数的部分-最后一个?
使它成为可选的。
我现在将最后一个参数设为可选,因此它同时支持
{Image,picture.jpg,Centre,Picture Info}
和
{Image,ServiceTile.jpg,Left}
后者导致
<img src=\'ServiceTile.jpg\' alt=\'\' class=\'quipImgLeft\'></img>
我已经在http://rextester.com/rundotnet中使用以下代码对此进行了测试:
string YourHtmlStringWithPlaceholders = \"Aenean {Image,Picture Info} non felis at est gravida tincidunt. {Link,news.bbc.co.uk,popup,500,800} Donec non diam a mauris vestibulum condimentum eu vitae mi! Aenean sed elit libero,id mollis felis! {Image,Left}\";
Regex PlaceholderExpander = new Regex(@\"\\{Image,\"<img src=\'$1\' alt=\'$3\' class=\'quipImg$2\'></img>\");
Console.WriteLine(Expanded);
, 基本上,您正在寻找“不匹配的比赛”(注意11英镑)。下列:
/\\{(.*?)\\}/
大括号内将匹配尽可能少的字符。从那里,您将需要获取内容并根据您认为格式应遵循的方式进行解析。
如果仅查找图像,当然也可以指定该图像:
/\\{Image (.*?)\\}/
, 我想您只想要\\{[^{}\\n\\r]+}
之类的东西。
在其中添加\\n\\r
,这样就不会在随机的ѭ21run上跑得太多。
, 您可以将正则表达式更改为不太贪婪:{[^}]+}