这是我的链接
<img src='http://www.example.org/images/post_images/2400.jpg' /><div>© Ham Sammich</div></div>
我想删除/>
之后的文字,从而制作链接..
<img src='http://www.example.org/images/post_images/2400.jpg' />
我尝试在最后使用strstr()
函数,但是我的vps没有选择转到php5.3,因此不能使用。
这是我的代码,因为5.3没有在那里而无效..
$imgTwo = strstr($img, ">", 1);
$img = $imgTwo . ">";
什么是以我想要的方式完成这项工作的良好替代品?
答案 0 :(得分:3)
@ strongonhanRich给出的替代解决方案,不涉及正则表达式。
$result = array_shift(explode('/>', $string)).'/>';
其中$string
是您的字符串,$result
是处理结果。
这意味着什么?它说&#34; 将字符串拆分为&#34; /&gt;&#34;并在第一次出现之前返回部分,然后添加&#34; /&gt;&#34;它保存为$ result &#34;。这意味着它完全符合您的要求:)
以下是此实际有效的演示:codepad.org/0TTCypA5
还有以上替代解决方案的替代解决方案:)
$result = substr($string, 0, strpos($string, '/>')+2);
其示范在这里:codepad.org/ifyJiaPB。这个说:&#34; 找到第一次出现的位置&#34; /&gt;&#34;在字符串中并返回之前的所有内容,包括&#34; /&gt;&#34;本身&#34;
答案 1 :(得分:1)
preg_match( '/<img[^>]*>/', $img, $matches);
$ matches [0]将只是img
标记。
答案 2 :(得分:0)
哦strstr()
之前的黑暗时间......
以下是一些可能的方法:
代码:(Demo with PHP5.2.17)
$string='<img src=\'http://www.example.org/images/post_images/2400.jpg\' /><div>© Ham Sammich</div></div>';
//echo 'strstr: ';
//echo strstr($string,'<div>',true); // not in php5.2
echo "strtok: ";
echo strtok($string,'>'),'>';
echo "\n\nsubstr/strpos: ";
echo substr($string,0,strpos($string,'<div>'));
echo "\n\nexplode no limit: ";
//echo explode('<div>',$string)[0]; // not in php5.2
echo current(explode('<div>',$string));
echo "\n\nexplode limit 2: ";
//echo explode('<div>',$string,2)[0]; // not in php5.2
echo current(explode('<div>',$string,2));
echo "\n\npreg_match: ";
//echo preg_match('/<img[^>]*>/',$string,$out)?$out[0]:$string; // not in php5.2
echo preg_match('/<img[^>]*>/',$string,$out)?current($out):$string;
echo "\n\npreg_split: ";
//echo preg_split('/>\K/',$string,2)[0]; // not in php5.2
echo current(preg_split('/>\K/',$string,2));
echo "\n\npreg_replace: ";
echo preg_replace('/<div>.*/','',$string);
输出:
strtok: <img src='http://www.example.org/images/post_images/2400.jpg' />
substr/strpos: <img src='http://www.example.org/images/post_images/2400.jpg' />
explode no limit: <img src='http://www.example.org/images/post_images/2400.jpg' />
explode limit 2: <img src='http://www.example.org/images/post_images/2400.jpg' />
preg_match: <img src='http://www.example.org/images/post_images/2400.jpg' />
preg_split: <img src='http://www.example.org/images/post_images/2400.jpg' />
preg_replace: <img src='http://www.example.org/images/post_images/2400.jpg' />
strstr($string,'<div>',true);
- 这可能是最好的调用 - 一个函数调用创建所需的字符串,没有额外的函数调用,没有多余的内存使用/没有连接。strtok($string,'>'),'>'
- 这几乎是干净的,但并不完全是因为它只能搜索一个字符,因此我们必须更改目标,然后在最后连接字符。substr($string,0,strpos($string,'<div>'))
- 它从字符串生成所需的子字符串,但只需要一次调用就可以进行两次函数调用。current(explode('<div>',$string))
- 这会生成一个无限元素数组,只能访问第一个字符串。这是两个函数调用,并不是很干净,因为它要求完成比必要的更多的工作。current(explode('<div>',$string,2));
- 限制元素比以前的explode方法更好,但同样的原则适用:为什么在只需要字符串时创建一个数组。preg_match('/<img[^>]*>/',$string,$out)?current($out):'failed';
- 无论是preg_match,preg_split,preg_replace等,正则表达式模式都比非正则表达式函数慢得多。对于这种情况,采用正则表达式方法没有任何优势。因此,虽然它只是一个函数调用,但它不会是最有效的方式。如果您愿意,请执行自己的基准测试,但对于这样一个小字符串,性能将无法与最终用户区分开来。
下一个标准将取决于您。也许你觉得有一种方法比另一种方式更容易阅读,或者你想要一个如果缺少预期的分隔符就不会轻易窒息的功能。