【正则超级难题】请『阿信』,『梅花雪』 等高手进来指点一下,分不够再加,拒绝只UP,接分不帮忙出主意者!

是是非非 2004-11-10 03:22:46
var str1="<PName Type=\"String\" Host=\"LocalHost\"><![CDATA[测试]]></PName>";
var str2="<PName Type=\"String\"><![CDATA[测试]]></PName>";
var str3="<PName Type=\"String\">测试</PName>";
var str4="<PName>A</PName>";
var str5="<PName />";
============================
以上是测试数据

现在要吧他们格式化成 <PName Type="……"><![CDATA[]]></PName>这种格式
并且取出节点的名字 PName,节点的类型 Type属性所指定的,节点Value CDATA段的内容

注意:str1里面的Host属性被忽略了,只需要取Type属性
若没有Type属性就给他加上一个空的Type属性

还要检查输入的合法性,是不是合法的XML节点…………
...全文
180 14 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
meizz 2004-11-11
  • 打赏
  • 举报
回复
String.prototype.getValue = function(name)
{
var p = this.replace(/\s+=\s+/g, "="); if(p=="") return "";
var reg = new RegExp("(^| )"+ name +"(=|:)(\\\"|\\\')?([^\\3]*?)(\\3)( |>|$)", "i");
var r = p.match(reg); if (r!=null) return r[4]; return "";
};
String.prototype.meizz = function()
{
var type = this.getValue("type");
var PN = this.match(/<(\w+)/);
if(PN)
{
var a = this.match(/<!\[CDATA\[(.*?)\]\]>/);
var content = a ? a[1] : "";
return "<"+ PN[1] +" type=\""+ type +"\">"+ content +"<\/"+ PN[1] +">";
}
return "";
}
var str1="<PName type=\"String\" Host=\"LocalHost\"><![CDATA[测试]]></PName>";
var str2="<PName Type=\"String\"><![CDATA[测试]]></PName>";
var str3="<PName Type=\"String\">测试</PName>";
var str4="<PName>A</PName>";
var str5="<PName />";
var str6="<PName type=\"S>tring\" Host=\"LocalHo<st\"><![CDATA[测试]]></PName>";
alert(str1 +"\r\n"+ str1.meizz());
alert(str2 +"\r\n"+ str2.meizz());
alert(str3 +"\r\n"+ str3.meizz());
alert(str4 +"\r\n"+ str4.meizz());
alert(str5 +"\r\n"+ str5.meizz());
alert(str6 +"\r\n"+ str6.meizz());
是是非非 2004-11-11
  • 打赏
  • 举报
回复
老大太强了,偶只有佩服的份

呵呵
xzq686 2004-11-11
  • 打赏
  • 举报
回复
meizz(梅花雪 封闭开发中) 一直是我的偶像
我的正则功力还不行。。研究一下梅老大的吧。。
顺便顶一下帖子。
是是非非 2004-11-10
  • 打赏
  • 举报
回复
to ttyp(愿赌服输)
辛苦了,不过你的代码在理想状况下完全正确,可下面这个就不行了

var str1="<PName type=\"S>tring\" Host=\"LocalHo<st\"><![CDATA[测试]]></PName>";
看来我得考虑放弃正则了,只能自己一个字节一个字节的分析
是是非非 2004-11-10
  • 打赏
  • 举报
回复
to : conquersky(宇森)
不错不错,给你20分
ttyp 2004-11-10
  • 打赏
  • 举报
回复
<script language="JavaScript">
<!--
var str1="<PName type=\"String\" Host=\"LocalHost\"><![CDATA[测试]]></PName>";
var re = /\<(\w+) ([^\>]*?)\>(.*?)<\/\1>/

var s = str1.match(re);
if(s!=null)
{

var arrtibutes_str = /(\w+)=\"([^\"]*?)\"/g

var primary_attribute_value;

primary_attribute_value = '';

var arrtibutes = s[2].match(arrtibutes_str);
if(arrtibutes!=null)
{
for(var i=0;i<arrtibutes.length;i++)
{
var arrtibute = arrtibutes[i].split('=');

if(arrtibute[0].toLowerCase()=="type")
{
primary_attribute_value = arrtibute[1];
}

}
}
else
{
alert("空类型");
}

var content = s[3].match(/<!\[CDATA\[(.*?)\]\]>/);
var c

if(content!=null)
{
c = (content[1]);
}
else
{
c = s[3];
}

alert("<" + s[1] + " Type=\"" + primary_attribute_value + "\">" + c + "</" + s[1] + ">");

}

//-->
</script>
conquersky 2004-11-10
  • 打赏
  • 举报
回复
还是需要顶阿 赫赫 怎么能拒绝别的帮助呢
是是非非 2004-11-10
  • 打赏
  • 举报
回复
自己 up
是是非非 2004-11-10
  • 打赏
  • 举报
回复
我觉得最麻烦的就是怎么分析那些属性
其实我是想先把所有的属性都分析出来,放到一个对象数组里面
然后再挑出Type属性(Type属性在我的这个程序里面是“保留字”,呵呵)

以后可能还有其他的保留字增加的,这样才方便
ttyp 2004-11-10
  • 打赏
  • 举报
回复
先把麻烦的地方说说
是是非非 2004-11-10
  • 打赏
  • 举报
回复
to ttyp(愿赌服输) :

咱今个儿是对上了,呵呵

继续请教

其实我是想写一个简单的XML分析程序,避免使用DOM这个大家伙
节点的属性通常来说只有Type出现
我封装了一个XMLAttribute
节点的名称和属性名称规则是这样的:[a-z]((a-z0-9)+[\_])*[a-z]
现在在封装XMLNode的时候有点麻烦
你上面给的代码都可以使用,,但是扩展起来好像比较麻烦


ttyp 2004-11-10
  • 打赏
  • 举报
回复
<script language="JavaScript">
<!--
var str1="<PName Type=\"String\" Host=\"LocalHost\"><![CDATA[测试]]></PName>";
var re = /\<(\w+) ([^\>]*?)\>(.*?)<\/\1>/

var s = str1.match(re);
if(s!=null)
{

var t = /Type\=\"([^\"]*?)\"/
var tt;
var type = s[2].match(t);
if(type!=null)
{
tt = type[1];
alert("类型:" + type[1]);
}
else
{
alert("空类型");
}

var content = s[3].match(/<!\[CDATA\[(.*?)\]\]>/);
var c

if(content!=null)
{
c = (content[1]);
}
else
{
c = s[3];
}

alert("<" + s[1] + " Type=\"" + tt + "\">" + c + "</" + s[1] + ">");

}

//-->
</script>
是是非非 2004-11-10
  • 打赏
  • 举报
回复
如果要把<![CDATA[ ]]>之间的内容取出来呢?
不能用DOM
ttyp 2004-11-10
  • 打赏
  • 举报
回复
<script language="JavaScript">
<!--
var str1="<PName Type=\"String\" Host=\"LocalHost\"><![CDATA[测试]]></PName>";
var re = /\<(\w+) ([^\>]*?)\>(.*?)<\/\1>/

if(re.test(str1))
{
var s = str1.match(re);
var t = /Type\=\"([^\"]*?)\"/
var tt;
if(t.test(s[2]))
{
var type = s[2].match(t);
tt = type[1];
alert("类型:" + type[1]);
}
else
{

alert("空类型");
}

alert("<" + s[1] + " Type=\"" + tt + "\">" + s[3] + "</" + s[1] + ">");

}

//-->
</script>

//随便写了下,你再改改吧
发帖
JavaScript

8.7w+

社区成员

Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
帖子事件
创建了帖子
2004-11-10 03:22
社区公告
暂无公告