PHP自动更正网址

时间:2014-02-19 02:50:51

标签: php

我不想重新发明轮子,但我找不到能完美做到这一点的图书馆。

在我的脚本中,用户可以保存网址,我希望他们给我列表如下:

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。)

是否有一些“智能”解决方案,或者我应该坚持我的当前:

  • 查找第一个出现的://并验证它之前的文本是否为有效协议,如果缺少则添加协议
  • 发现下一次出现/并且验证主机名是否为有效格式
  • 为了更好的衡量标准,请通过RegExp整个网址
  • 再次验证

我只是觉得我会拒绝一些有效的URL,对我来说最好是假阳性,假阴性。

2 个答案:

答案 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。

,我的初始版本显然存在问题

谢谢特伦特