按内部 HTML 对超链接数组进行排序

Posted

技术标签:

【中文标题】按内部 HTML 对超链接数组进行排序【英文标题】:Sort array of hyperlinks by inner HTML 【发布时间】:2018-09-13 03:45:54 【问题描述】:

我有一个这样的数组:

array(6)  [0]=> string(116) "A" [1]=> string(112) "C" [2]=> string(110) "B" [3]=> string(115) "F" [4]=> string(113) "D" [5]=> string(112) "E" 

哪个字母代表一个超链接,所以每个字母是:

<a href="link">Letter</a>

我想对这个数组进行排序,所以我让它按字母/innerhtml 排序

我想在回显之前对其进行排序。

任何帮助将不胜感激。

谢谢

【问题讨论】:

所有的hrefs真的不同吗?只是确保我理解正确。 是的,它们都是不同的。 【参考方案1】:

您可以拆分链接并使用字母作为键和完整链接作为值创建新的关联数组。试试下面的代码。

$links=['<a href="link">D</a>','<a href="link">B</a>','<a href="link">C</a>','<a href="link">A</a>'];
    $new_links=[];
    foreach($links as $link)
        $array_1= explode(">",$link);
        $array_2 = explode("<",$array_1[1]);    
        $new_links[$array_2[0]]=$link;
    
     ksort($new_links);

【讨论】:

太棒了!!它确实解决了这个问题。一个小问题是当一个链接被选中时,它的键值变为空。任何想法?谢谢!! 我不清楚“选择链接时”是什么意思。你可以为这种情况放一个示例数组吗?【参考方案2】:

您可以usort 使用仅比较链接文本的回调。

$link = '/.+>(.+)<.+/';    
usort($array, function($a, $b) use ($link) 
    return preg_replace($link, '\1', $a) <=> preg_replace($link, '\1', $b);
    // If you're on php 5 without the <=> operator, you can use strcmp instead
    // return strcmp(preg_replace($link, '\1', $a), preg_replace($link, '\1', $b));
);

我不是正则表达式专家,所以可能有更好的方法来编写模式,但总体思路是一样的。众所周知,使用正则表达式解析任意 HTML 不是一个好主意,但对于像 &lt;a&gt; 标签数组这样的东西,它似乎很困难。

【讨论】:

我会试试这个,但看起来像 php 7。我需要 5 个 atm。谢谢 @GabrielG 在 PHP 5 上仍然可行。您可以使用 strcmp 代替 &lt;=&gt;(或 strcasecmp 进行不区分大小写的比较)。【参考方案3】:

我建议使用 strip_tags() 并对结果进行排序,但如果要保留多个链接实例,则需要使用多维数组并对其进行排序:

$unsortedArray = [
  '<a href="/orange">Orange</a>',
  '<a href="/banana2">Banana</a>',
  '<a href="/apple">Apple</a>',
  '<a href="/pineapple">pineapple</a>',
  '<a href="/banana">Banana</a>',
  '<a href="/apple">Apple 2</a>',
];

$sortedArray = [];

function sortLinks($links) 
  $splitArray = [];
  $sortedArray = [];

  foreach($links as $link) 
    $label = strip_tags($link);
    $splitArray[] = ['link' => $link, 'label' => $label];
  

  usort($splitArray, function ($a, $b) 
    return $a['label'] <=> $b['label'];
  );

  foreach ($splitArray as $item) 
    $sortedArray[] = $item['link'];
  

  return $sortedArray;


$sorted = sortLinks($unsortedArray);

echo '<pre>' . print_r($sorted, 1) . '</pre>';

输出应该是:

Array
(
    [0] => Apple
    [1] => Apple 2
    [2] => Banana
    [3] => Banana
    [4] => Orange
    [5] => pineapple
)

【讨论】:

以上是关于按内部 HTML 对超链接数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

您可以在 XAML 属性数据绑定期间对超链接的 NavigateUri 属性进行 StringFormat 吗?

对超链接使用“border-bottom”而不是“text-decoration”——它在语义上是不是正确?

html中加入超链接方式的汇总

WPF流文档超链接

超空间雕刻

我的word打开的时候总是提示超链接不可用,怎么回事???