我不想重新发明轮子,但我找不到能完美做到这一点的图书馆。
在我的脚本中,用户可以保存网址,我希望他们给我列表如下:
google.com
www.msn.com
http://bing.com/
and so on...
我希望能够以“正确的格式”保存在数据库中。
我做的是检查是否有协议,如果它不存在,我添加它然后根据RegExp验证URL。
对于PHP parse_url,任何包含协议的URL都是有效的,所以它没有多大帮助。
你是如何做到这一点的,你有什么想法想与我分享吗?
编辑:
我想从用户输入中筛选出无效的网址(网址列表)。更重要的是,尝试自动更正无效的URL(例如,不包含协议)。如果用户输入列表,则应立即进行验证(没时间打开URL来检查它们确实存在的那些)。
从网址中提取部分会很好,例如parse_url
,但问题是parse_url
,它对无效网址效果不佳。我试图用它解析URL,并且对于缺少(并且是必需的)添加默认值的部分(例如没有协议,添加http)。但是,“{google.com”的parse_url
不会将“google.com”作为主机名返回,而是作为路径返回。
这看起来对我来说真的很常见,但是我在互联网上找不到可用的解决方案(找到了一些标准化URL的库,但是如果它无效则不会修复URL。)
是否有一些“智能”解决方案,或者我应该坚持我的当前:
我只是觉得我会拒绝一些有效的URL,对我来说最好是假阳性,假阴性。
答案 0 :(得分:5)
我的parse_url与OP有同样的问题,这是我自动更正网址的快速而肮脏的解决方案(请记住,代码绝不是完美的或涵盖所有情况):
public Transform greenCubeCenter;
public float ThrowForceMagnitude = 50.0f;
Transform touchedObject = null; // this will hold the touched object
void Update () {
Collider2D touch = Physics2D.OverlapCircle(touchDetect.position, 0.01f, objectLayer);
if(touch == null) // we don't do anything if we don't touch anything
return;
if (Input.GetKey(KeyCode.LeftShift)) { // let's do everything in one if
ligado = true; // if the arm touch the cube we set ligado to true
if(touchedObject == null) // we didn't have anything grabbed
{
touchedObject = touch.gameObject.transform;
touchedObject.parent = this.transform; // "glue" the object to the arm
touchedObject.GetComponent<Rigidbody2D>().isKinematic = true; // forbid other forces to move our object
Physics2D.IgnoreLayerCollision(10, 12, true); // I let this thing here, don't really know what it does in this context
}
} else {
ligado = false; // in any case we're not in "grab mode" anymore so let's set ligado to false
if(touchedObject != null) // if we were grabing something
{
touchedObject.parent = null; // let the object free
touchedObject.GetComponent<Rigidbody2D>().isKinematic = false; // let it be affected by reality again
Physics2D.IgnoreLayerCollision(10, 12, false); // restoring the think I didn't understand before hand
// Below the actual throwing part
Vector2 force = (touchDetect.position - greenCubeCenter.position).normalized * ThrowForceMagnitude;
touchedObject.GetComponent<Rigidbody2D>().AddForce(force); // actually throwing the object
touchedObject = null; // we let the object go so we set touchedObject to null
}
}
mao1.SetBool("Ligado", ligado); // updating display
}
Results:
http:/wwww.example.com/lorum.html => http://www.example.com/lorum.html
gopher:/ww.example.com => gopher://www.example.com
http:/www3.example.com/?q=asd&f=#asd =>http://www3.example.com/?q=asd&f=#asd
asd://.example.com/folder/folder/ =>http://example.com/folder/folder/
.example.com/ => http://example.com/
example.com =>http://example.com
subdomain.example.com => http://subdomain.example.com
答案 1 :(得分:0)
这不是100%万无一失,而是1个班轮。
$URL = (((strpos($URL,'https://') === false) && (strpos($URL,'http://') === false))?'http://':'' ).$URL;
修改强> 如果主机名包含http。
,我的初始版本显然存在问题谢谢特伦特